Как получить SID вошедшего в систему удаленного пользователя в моем домене и назначить его переменной в PowerShell?

Я думаю, что название подводит итог.

я обычно использую

gwmi win32_userprofile | select sid, localpath

Поэтому я могу запросить полный список пользователей на машине, но я пытаюсь упростить процесс для удаленных компьютеров. В основном я хочу ввести имя компьютера, затем он проверит текущего пользователя, вошедшего в систему, и использует эту учетную запись пользователя, чтобы найти связанный SID. Оттуда я бы хотел, чтобы SID был назначен переменной, чтобы я мог использовать его для других функций в моем скрипте.

Заранее спасибо за помощь.


person madwheel    schedule 27.01.2016    source источник


Ответы (2)


Я бы использовал свойство UserName в WMI-классе Win32_ComputerSystem, чтобы получить текущего пользователя, вошедшего в систему, а затем преобразовать результат. Я использую Foreach-Object-цикл, поэтому он будет продолжаться, если есть значение (пользователь вошел в систему), но остановится без ошибок, если значение было пустым (пользователь не вошел в систему). Бывший:

$currentusersid = Get-WmiObject -Class win32_computersystem |
Select-Object -ExpandProperty Username |
ForEach-Object { ([System.Security.Principal.NTAccount]$_).Translate([System.Security.Principal.SecurityIdentifier]).Value }

PS C:\Users\frode> $currentusersid
S-1-5-21-333330555-1449773115-1111222333-1001
person Frode F.    schedule 27.01.2016
comment
Это здорово, спасибо. Значит, этот код больше предназначен для локальной машины? Или я могу использовать что-то вроде [Environment]::UserName, чтобы получить удаленное имя пользователя? Извините, я звучу как полный новичок. Мой опыт работы на C++, поэтому все, что связано с powershell, мне незнакомо. - person madwheel; 27.01.2016
comment
Если вам нужно проверить удаленный компьютер, попробуйте добавить параметр -ComputerName "myremotecomputer" в команду Get-WmiObject - person Frode F.; 27.01.2016
comment
Я попробую. Спасибо большое за вашу помощь. Я проголосую за ваш ответ. - person madwheel; 27.01.2016
comment
Так будет ли это выглядеть как мой ответ ниже? - person madwheel; 28.01.2016
comment
$currentusersid = Get-WmiObject -Class win32_computersystem -ComputerName xxxxxx12334| Select-Object -ExpandProperty Имя пользователя | ForEach-Object { ([System.Security.Principal.NTAccount]$_).Translate([System.Security.Principal.SecurityIdentifier]).Value } - person madwheel; 28.01.2016
comment
@madwheel это правильно. также вместо [Environment]::UserName можно использовать $env:USERNAME - person Anthony Stringer; 28.01.2016
comment
@madwheel да, ты можешь попробовать это. @AnthonyStringer, чтобы использовать переменные среды, ему нужно будет использовать что-то вроде invoke-command для выполнения кода на удаленном компьютере. С WMI он мог запустить это с сервера управления :) - person Frode F.; 28.01.2016

преобразовать SID в имя пользователя

([System.Security.Principal.SecurityIdentifier]('PUT-SID-HERE')).Translate([System.Security.Principal.NTAccount]).Value

преобразовать имя пользователя в SID

([System.Security.Principal.NTAccount]("domain\john.smith")).Translate([System.Security.Principal.SecurityIdentifier]).Value

и вы также можете использовать PsLoggedon.exe, чтобы получить имя пользователя, вошедшего в систему.

person Anthony Stringer    schedule 27.01.2016