Достаточно часто на форумах возникает вопрос – “Как получить имя пользователя работающего в системе в данный момент?”. Такое может понадобится например если у нас есть сценарий обрабатывающий все включенные компьютеры, и ему нужно знать имя текущего пользователя.
Итак, какие есть решения… А решений вроде бы немало. Во-первых – 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









[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
я со своего компа еще запустил пару mmc под второй учеткой, они видятся так так же как сейчас работающие.
Caption : ISEA\abigor
Domain : ISEA
SID : S-1-5-21-839522115-2146729155-1343024091-9845
FullName : Захарченко Андрей Русланович
Name : abigor
хе-хе, надо еще фильтр делать
Комментарий от abigor — 4.6.2009 @ 9:57
2 abigor, угу, я для того и дал ссылку на типы логонов. Просто в первом запросе меняй
Комментарий от Xaegr — 4.6.2009 @ 9:59
может все же свой свойство RemoteInteractive не надо сюда вставлять? чтоб выловить только интерактивных?
Комментарий от abigor — 4.6.2009 @ 10:01
хе, как всегда, сначала пишу, потом читаю как говорится
сначало запостил, потом стал разбирать запрос wmi
Комментарий от abigor — 4.6.2009 @ 10:02
вася, ты религиозный фоннат. Понятно же, что на вбскрипте там собственно кода тоже ОДИН запрос к WMI. Точно такой же, не поверишь, как и у тебя. А всё остальное — тоже всякие обвязки.
Комментарий от artem — 4.6.2009 @ 10:59
А встроенная команда whoami не подходит ?
Комментарий от cognize — 4.6.2009 @ 11:08
2 artem: Ага, всё тоже самое. По сути. Но вот в результате на PS с обвязками и красотой 5 строк, а не страница
И большая часть текста – WMI запросы, а не всякое прочее
2 cognize: Нет разумеется. Я хотел отдельно упомянуть чтобы не путали с определением пользователя под которым выполняется сценарий, но подумал что и так внимательно читать будут
Ни whoami ни $env:username не подходят.
Комментарий от Xaegr — 4.6.2009 @ 11:34
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
2 Kudrat: psloggedon
Комментарий от Xaegr — 25.6.2009 @ 13:03
Я в свое время (давно это было) использовал прогу 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
Кстати вопросик возник…
У меня в этом скрипте не отрабатывает «Associators of {Win32_LogonSession.LogonId=$($_.logonid)} Where AssocClass=Win32_LoggedOnUser Role=Dependent» на удаленных компах .
Если проводить отладку, то видно, что LogonId получает правильно, а вот информацию о сессии получить не может. С чем это могет быть сказано?
В своем скрипте я вообше обращаюсь к Win32_ComputerSystem, но он дает информацию о текущем пользователе…
Комментарий от HomeDimoN — 14.7.2009 @ 19:09
[...] Не для кого, наверно, уже не секрет, что Microsoft встраивает PowerShell во все свои новые продукты (unix way?). В предстоящем будущем любой квалифицированный администратор информационных систем на базе продуктов Microsoft будет просто обязан знать данный язык. Поэтому я открываю рубрику PowerShell и первый пост начнем новостью из блога MVP Василия Гусева. Оригинал тут [...]
Уведомление от Записки СетеСтроителя » PowerShell – Как получить имя пользователя работающего в системе в данный момент? — 12.8.2009 @ 14:44
Можно ту же задачу решить другим способом, при этом код на 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
Под меньше по объему подразумевал – меньше кода на 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
Артём, я не много не до понял, ссылка, которую вы привели (она кстати не работает), есть в данной статье. Код, который вы привели, однозначно больше чем код на posh. Ну и на мой взгляд это вообще не корректно сравнивать, код на posh можно было свести в одну строчку, а он разросся только из-за того что из него сделали командлет для постоянного использования.
Может вы объясните что вы хотели сказать?
Комментарий от zorion — 26.9.2009 @ 1:39
Я хотел сказать только то, что сказал – тот VBS скрипт,ссылка на который есть в статье, не оптимален по объему и размеру…. По сути, пост был только из-за фразы Василия «Здорово да? А казалось бы, такая простая задачка… Но может быть дело не в задачке, а в языке?» Не спорю, что PoSh – отличный язык, использую его последнее время все чаще, но все-таки основное преимущество языка не в том что скрипты получаются меньшими по объему…
З.Ы. командный файл, определяющий залогиненного пользователя, использующий WMIC будет еще меньше:
wmic /node:”%PCName%” computersystem get username
Комментарий от Artem Gusev [Guard] — 26.9.2009 @ 9:56
Артём, те примеры что вы привели аналогичны PowerShell’овскому (gwmi win32_computersystem).username
Но в посте речь не об этом. Я видимо забыл упомянуть что win32_computersystem username возвращает правильные данные только в случае локального компьютера. На удалённом он вернёт имя того пользователя под которым был запущен сценарий, а не консольного. Да и в случае терминалок тоже бесполезен.
Да, разумеется премущество PS – не только короткий код, но тут я хотел обратить внимание именно на это
Комментарий от Xaegr — 26.9.2009 @ 10:16
Не флуда ради, а токмо общения для

Для меня основное премущество PoSh перед другими скриптовыми языками в его умении оперировать объектами….
Комментарий от Artem Gusev [Guard] — 26.9.2009 @ 10:28
Ну объектами и VBS может оперировать… Не так хорошо конечно и не .Net
Для меня главное преимущество PS – это огромное количество всевозможных преимуществ, крупных и мелких, в одном месте. И относительно маленькое количество недостатков
Комментарий от Xaegr — 26.9.2009 @ 10:30
Василий, я хотел спросить, не в тему, по поводу:
> psloggedon… А еще у неё какие то проблемы с юникодом
Вы, не в курсе, — сие (для некоторых консольных утилит от бывшего Sysinternals) принципиально не лечится?
Я пробовал разные способы, также раза два за последние три года кропотливо лопатил поиск, — безрезультатно. Случайно наткнулся на упоминание об этой проблеме у Вас и решил поинтересоваться.
Комментарий от AlexII — 19.10.2009 @ 1:29
2 AlexII: Разве что автор поправит…
Комментарий от Xaegr — 19.10.2009 @ 19:22
Спасибо, ясно.
Комментарий от AlexII — 19.10.2009 @ 21:10
Gwmi Win32_Computersystem -Comp “.” | Select Name, UserName
Комментарий от HomeDimoN — 22.10.2009 @ 16:01
2 HomeDimoN: комментарий 17 прочитайте.
Комментарий от Xaegr — 22.10.2009 @ 16:03