PowerShell и другие скрипты

4.6.2009

Текущий “залогиненный” пользователь

Рубрика: Uncategorized — Метки: , , — Xaegr @ 9:16

Достаточно часто на форумах возникает вопрос – “Как получить имя пользователя работающего в системе в данный момент?”. Такое может понадобится например если у нас есть сценарий обрабатывающий все включенные компьютеры, и ему нужно знать имя текущего пользователя.

Итак, какие есть решения… А решений вроде бы немало. Во-первых – psloggedon.exe, прекрасная утилита от Microsoft SysInternals с отличными возможностями… но не для нашей задачи. Лучшее что она может – вывести список учетных записей выполнивших вход. Интерактивных и нет. Пользовательских и служб…

PS C:\root> psloggedon -l -x

loggedon v1.33 - See who's logged on
Copyright й 2000-2006 Mark Russinovich
Sysinternals - www.sysinternals.com

Users logged on locally:
     NT AUTHORITY\LOCAL SERVICE
     NT AUTHORITY\NETWORK SERVICE
     EURAZFIN\gusev
     EURAZFIN\sa1
     NT AUTHORITY\???????

А еще у неё какие то проблемы с юникодом… :( Придётся поискать другой метод. И он достаточно легко находится. На vbscript – http://blogs.msdn.com/alejacma/archive/2008/03/04/how-to-get-the-logged-on-user-with-wmi-vbscript.aspx. Здорово да? А казалось бы, такая простая задачка… Но может быть дело не в задачке, а в языке? ;)

Итак, решение на PowerShell. Сразу в виде удобной функции. По умолчанию получает текущего пользователя для локального компьютера, но можно указать и удалённый.

Function Get-LoggedOn ($Comp = $env:computername)
{
Get-WmiObject -computername $Comp -query `
    "Select logonid from Win32_LogonSession where logontype = 2 or logontype = 10" |
foreach {Get-WmiObject -computername $Comp -query `
    "Associators of {Win32_LogonSession.LogonId=$($_.logonid)} Where AssocClass=Win32_LoggedOnUser Role=Dependent"}
}            

Фактически тут только 1-2 строчки. Остальное для читабельности и обёртка в функцию. Копипастим её в консоль (или сразу в файл профиля), и используем:

PS C:\root> Get-LoggedOn esprimo10

AccountType : 512
Caption     : MYDOMAIN\gusev
Domain      : MYDOMAIN
SID         : S-1-5-21-445788029-8720151102-0124946612-1722
FullName    : Гусев Василий
Name        : gusev

Если вам нужны другие типы сессий, то вот тут есть полный список значений LogonType которые можно использовать в WMI запросе – http://msdn.microsoft.com/en-us/library/aa394189.aspx

Комментарии (24) »

  1. [PS] C:\Bin>Get-LoggedOn

    AccountType : 512
    Caption : ISEA\abigor_adm
    Domain : ISEA
    SID : S-1-5-21-839522115-2146729155-1343024091-10617
    FullName : Захарченко Андрей Русланович
    Name : abigor_adm

    AccountType : 512
    Caption : ISEA\abigor_adm
    Domain : ISEA
    SID : S-1-5-21-839522115-2146729155-1343024091-10617
    FullName : Захарченко Андрей Русланович
    Name : abigor_adm

    AccountType : 512
    Caption : ISEA\abigor
    Domain : ISEA
    SID : S-1-5-21-839522115-2146729155-1343024091-9845
    FullName : Захарченко Андрей Русланович
    Name : abigor
    хе-хе, надо еще фильтр делать :) я со своего компа еще запустил пару mmc под второй учеткой, они видятся так так же как сейчас работающие.

    Комментарий от abigor — 4.6.2009 @ 9:57

  2. 2 abigor, угу, я для того и дал ссылку на типы логонов. Просто в первом запросе меняй :)

    Комментарий от Xaegr — 4.6.2009 @ 9:59

  3. может все же свой свойство RemoteInteractive не надо сюда вставлять? чтоб выловить только интерактивных?

    Комментарий от abigor — 4.6.2009 @ 10:01

  4. хе, как всегда, сначала пишу, потом читаю как говорится :) сначало запостил, потом стал разбирать запрос wmi

    Комментарий от abigor — 4.6.2009 @ 10:02

  5. вася, ты религиозный фоннат. Понятно же, что на вбскрипте там собственно кода тоже ОДИН запрос к WMI. Точно такой же, не поверишь, как и у тебя. А всё остальное — тоже всякие обвязки.

    Комментарий от artem — 4.6.2009 @ 10:59

  6. А встроенная команда whoami не подходит ?

    Комментарий от cognize — 4.6.2009 @ 11:08

  7. 2 artem: Ага, всё тоже самое. По сути. Но вот в результате на PS с обвязками и красотой 5 строк, а не страница :) И большая часть текста – WMI запросы, а не всякое прочее :)

    2 cognize: Нет разумеется. Я хотел отдельно упомянуть чтобы не путали с определением пользователя под которым выполняется сценарий, но подумал что и так внимательно читать будут :) Ни whoami ни $env:username не подходят.

    Комментарий от Xaegr — 4.6.2009 @ 11:34

  8. Privet Vasiliy,
    A net sluchayno scripta kotorij bi po imeni pol’zovatelya opredelyal PC v domene na kotorom etot pol’zovatel’ sejchas zaloginen?

    Spasibo,

    Комментарий от Kudrat — 25.6.2009 @ 12:55

  9. 2 Kudrat: psloggedon ;)

    Комментарий от Xaegr — 25.6.2009 @ 13:03

  10. Я в свое время (давно это было) использовал прогу BROWN Nick NTName
    http://windowsitpro.com/article/articleid/71621/jsi-tip-0296—a-better-way-to-prevent-a-user-from-logging-on-more-than-once.html
    (ссылки на оригинал к сожалению не сохранилось)
    Она также подходила и для logon скрипта…
    А теперь пробегаюсь почти таким vbs скриптом, который кидает все в табличку, а там уже если надо сам ищу.

    Комментарий от HomeDimoN — 14.7.2009 @ 18:24

  11. Кстати вопросик возник…
    У меня в этом скрипте не отрабатывает «Associators of {Win32_LogonSession.LogonId=$($_.logonid)} Where AssocClass=Win32_LoggedOnUser Role=Dependent» на удаленных компах .
    Если проводить отладку, то видно, что LogonId получает правильно, а вот информацию о сессии получить не может. С чем это могет быть сказано?
    В своем скрипте я вообше обращаюсь к Win32_ComputerSystem, но он дает информацию о текущем пользователе…

    Комментарий от HomeDimoN — 14.7.2009 @ 19:09

  12. [...] Не для кого, наверно, уже не секрет, что Microsoft встраивает PowerShell во все свои новые продукты (unix way?). В предстоящем будущем любой квалифицированный администратор информационных систем на базе продуктов Microsoft будет просто обязан знать данный язык. Поэтому я открываю рубрику PowerShell и первый пост начнем новостью из блога MVP Василия Гусева. Оригинал тут [...]

    Уведомление от Записки СетеСтроителя » PowerShell – Как получить имя пользователя работающего в системе в данный момент? — 12.8.2009 @ 14:44

  13. Можно ту же задачу решить другим способом, при этом код на VBS будет меньше по объему:
    ———————————-
    Код на VBS
    ———————————-
    strComputer = WScript.Arguments(0)
    Set objWMIService = GetObject(«winmgmts:» _
    & «{impersonationLevel=impersonate}!\\» & strComputer & «\root\cimv2″)

    Set colComputer = objWMIService.ExecQuery _
    («Select * from Win32_ComputerSystem»)

    For Each objComputer in colComputer
    Wscript.Echo «Logged-on user: » & objComputer.UserName
    Next

    ———————————-
    Код на PoSh
    ———————————-
    $Comp = «.»
    $CS = Get-WmiObject Win32_ComputerSystem -computer $comp
    $CS| ForEach-Object {write-host $_.UserName}

    Комментарий от Artem Gusev [Guard] — 25.9.2009 @ 15:03

  14. Под меньше по объему подразумевал – меньше кода на VBS в посте (http://blogs.msdn.com/alejacma/archive/2008/03/04/how-to-get-the-logged-on-user-with-wmi-vbscript.aspx)

    Комментарий от Artem Gusev [Guard] — 25.9.2009 @ 15:06

  15. Артём, я не много не до понял, ссылка, которую вы привели (она кстати не работает), есть в данной статье. Код, который вы привели, однозначно больше чем код на posh. Ну и на мой взгляд это вообще не корректно сравнивать, код на posh можно было свести в одну строчку, а он разросся только из-за того что из него сделали командлет для постоянного использования.
    Может вы объясните что вы хотели сказать?

    Комментарий от zorion — 26.9.2009 @ 1:39

  16. Я хотел сказать только то, что сказал – тот VBS скрипт,ссылка на который есть в статье, не оптимален по объему и размеру…. По сути, пост был только из-за фразы Василия «Здорово да? А казалось бы, такая простая задачка… Но может быть дело не в задачке, а в языке?» Не спорю, что PoSh – отличный язык, использую его последнее время все чаще, но все-таки основное преимущество языка не в том что скрипты получаются меньшими по объему…
    З.Ы. командный файл, определяющий залогиненного пользователя, использующий WMIC будет еще меньше:
    wmic /node:”%PCName%” computersystem get username

    Комментарий от Artem Gusev [Guard] — 26.9.2009 @ 9:56

  17. Артём, те примеры что вы привели аналогичны PowerShell’овскому (gwmi win32_computersystem).username :) Но в посте речь не об этом. Я видимо забыл упомянуть что win32_computersystem username возвращает правильные данные только в случае локального компьютера. На удалённом он вернёт имя того пользователя под которым был запущен сценарий, а не консольного. Да и в случае терминалок тоже бесполезен.
    Да, разумеется премущество PS – не только короткий код, но тут я хотел обратить внимание именно на это :)

    Комментарий от Xaegr — 26.9.2009 @ 10:16

  18. Не флуда ради, а токмо общения для
    ;)
    Для меня основное премущество PoSh перед другими скриптовыми языками в его умении оперировать объектами….

    Комментарий от Artem Gusev [Guard] — 26.9.2009 @ 10:28

  19. Ну объектами и VBS может оперировать… Не так хорошо конечно и не .Net :)
    Для меня главное преимущество PS – это огромное количество всевозможных преимуществ, крупных и мелких, в одном месте. И относительно маленькое количество недостатков :)

    Комментарий от Xaegr — 26.9.2009 @ 10:30

  20. Василий, я хотел спросить, не в тему, по поводу:
    > psloggedon… А еще у неё какие то проблемы с юникодом
    Вы, не в курсе, — сие (для некоторых консольных утилит от бывшего Sysinternals) принципиально не лечится?

    Я пробовал разные способы, также раза два за последние три года кропотливо лопатил поиск, — безрезультатно. Случайно наткнулся на упоминание об этой проблеме у Вас и решил поинтересоваться.

    Комментарий от AlexII — 19.10.2009 @ 1:29

  21. 2 AlexII: Разве что автор поправит…

    Комментарий от Xaegr — 19.10.2009 @ 19:22

  22. Спасибо, ясно.

    Комментарий от AlexII — 19.10.2009 @ 21:10

  23. Gwmi Win32_Computersystem -Comp “.” | Select Name, UserName

    Комментарий от HomeDimoN — 22.10.2009 @ 16:01

  24. 2 HomeDimoN: комментарий 17 прочитайте.

    Комментарий от Xaegr — 22.10.2009 @ 16:03


RSS-лента комментариев к этой записи. URI для обратной ссылки

Оставить комментарий

Блог на WordPress.com.