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

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

Итак, какие есть решения… А решений вроде бы немало. Во-первых – 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

Опубликовано в Uncategorized. Метки: , , . 25 комментариев »

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

  1. abigor Says:

    [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 под второй учеткой, они видятся так так же как сейчас работающие.

  2. Xaegr Says:

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

  3. abigor Says:

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

  4. abigor Says:

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

  5. artem Says:

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

  6. cognize Says:

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

  7. Xaegr Says:

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

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

  8. Kudrat Says:

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

    Spasibo,

  9. Xaegr Says:

    2 Kudrat: psloggedon😉

  10. HomeDimoN Says:

    Я в свое время (давно это было) использовал прогу 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 скриптом, который кидает все в табличку, а там уже если надо сам ищу.

  11. HomeDimoN Says:

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

  12. Записки СетеСтроителя » PowerShell – Как получить имя пользователя работающего в системе в данный момент? Says:

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

  13. Artem Gusev [Guard] Says:

    Можно ту же задачу решить другим способом, при этом код на 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}

  14. Artem Gusev [Guard] Says:

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

  15. zorion Says:

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

  16. Artem Gusev [Guard] Says:

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

  17. Xaegr Says:

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

  18. Artem Gusev [Guard] Says:

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

  19. Xaegr Says:

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

  20. AlexII Says:

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

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

  21. Xaegr Says:

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

  22. AlexII Says:

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

  23. HomeDimoN Says:

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

  24. Xaegr Says:

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

  25. alexey Says:

    в пункте 17 сказано, что «На удалённом он вернёт имя того пользователя под которым был запущен сценарий, а не консольного. » не верно, возвращает имя залогиненного пользователя


Обсуждение закрыто.

%d такие блоггеры, как: