Чтобы быстро получить информацию о списке локальных пользователей на удалённом компьютере можно воспользоваться подключением через PowerShell к интерфейсу WMI с запросом в одну строку:
Get-WmiObject Win32_UserAccount -ComputerName MyPC -Filter "Domain= MyPC'"
Тоже самое, но уже при обращении к интерфейсу ADSI:
$computerName = "MyPC"
$computer = [ADSI]"WinNT://$computerName,computer"
$computer.psbase.Children | Where-Object { $_.psbase.schemaclassname -eq 'user' } | Format-Table Name, Description -autoSize
Если нужно получить информацию с локального компьютера в переменной $computerName укажем значение "."
По аналогии для получения списка локальных групп безопасности удалённого компьютера используем команду:
Get-WmiObject Win32_Group -ComputerName MyPC -Filter "Domain='MyPC'"
..или…
$computerName = "MyPC"
$computer = [ADSI]"WinNT://$computerName,computer"
$computer.psbase.Children | Where-Object { $_.psbase.schemaclassname -eq 'group' } | Format-Table Name, Description -autoSize
Если же мы хотим получить картину в целом по всем существующим группам безопасности и членам, входящим в эти группы используем более сложную конструкцию:
$computerName = "MyPC"
$computer = [ADSI]"WinNT:// $computerName,computer"
$computer.psbase.children | where { $_.psbase.schemaClassName -eq 'group' } | foreach {
write-host "Group:" $_.Name
write-host "Descr:" $_.Description
write-host "-----"
$group =[ADSI]$_.psbase.Path
$group.psbase.Invoke("Members") | foreach {
$ADSIName = $_.GetType().InvokeMember("AdsPath", 'GetProperty', $null, $_, $null)
if ($ADSIName -match "[^/]/[^/]") {
[String]::Join("", $ADSIName.Split("/")[-2..-1])
}
else {
$ADSIName.Split("/")[-1]
}
}
write-host
}
Источники информации:
Janel Blog - Script pour l'énumération des membres d'un groupe
Powershellcommunity Forum - Listing local user accounts on remote machines
Добавить комментарий