PowerShell – Получение информации о локальных пользователях и группах

Чтобы быстро получить информацию о списке локальных пользователей на удалённом компьютере можно воспользоваться подключением через 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

Добавить комментарий