Получение состава локальных групп удаленного ПК

2 мин на чтение

В нашей компании принято доступ на удаленный рабочий стол навешивать только на 1 ПК одному, очень редко нескольким, пользователям. Иногда сотрудник пересаживается за другой ПК или служба безопасности спрашивает кто может подключиться к тому или иному ПК по RDP. Лезть каждый раз для решения данной задачи в консоль или удаленно подключаться к ПК и мешать сотруднику работать — себе дороже, да и как-то не особо правильно.
Имея учетную запись с правами администратора можно воспользоваться одним небольшим скриптом, который поможет достать членов локальных групп удаленного ПК.
Итак, сам скрипт и далее его маленькая модификация:

cls
 $PC_name = "< ДНС имя ПК/IP адресс>"
 $PC_group = "< Имя группы, которую будем просматривать>"

if (Test-Connection $PC_name -Count 1 -ErrorAction SilentlyContinue){
 write-host $PC_group -BackgroundColor green
 $ADSI_WinNT = [ADSI]"WinNT://$PC_name/$PC_group,group"
 $ADSI_WinNT.Members() | foreach {
 $member = $_.GetType().InvokeMember("AdsPath","GetProperty",$null,$_,$null).split("/")[-1]
 $member
 }
 }
 else{
 Write-Host "$PC_name : НЕ ОТВЕЧАЕТ" -BackgroundColor red
 }

Если необходимо в начале получить список ПК из АД, а затем последовательно подключаться к полученным ПК и выгружать состав групп, то необходимо воспользоваться следующим кодом:

#В данном примере будут получены все ПК из АД. После этого, скрипт проверяет доступность ПК по сети, если ПК не в сети, то сообщит об этом, если в сети то попытается подключиться к нему и выгрузить состав групп:"Администраторы" , "Пользователи" , "Опытные пользователи" , "Пользователи удаленного рабочего стола"
#ЗЫ. Какие группы сканировать вы указываете сами, их количество ограничено вами.
 
cls
$PC_group_all = @('Администраторы','Пользователи','Опытные пользователи','Пользователи удаленного рабочего стола')
 
$all_PC = Get-ADComputer -Filter *
$all_PC | %{
    $PC = $_
    $PC_name = $PC.name
    if (Test-Connection $PC_name -Count 1 -ErrorAction SilentlyContinue){
        "*******************************************"
        write-host $PC_name -BackgroundColor green
        $PC_group_all | %{
            $PC_group = $_
            write-host "$PC_group" -BackgroundColor green
            $ADSI_WinNT = [ADSI]"WinNT://$PC_name/$PC_group,group"
            $ADSI_WinNT.Members() | foreach {
                $member = $_.GetType().InvokeMember("AdsPath","GetProperty",$null,$_,$null).split("/")[-1]
                $member
            }
        }
    }
    else{Write-Host "$PC_name : НЕ ОТВЕЧАЕТ" -BackgroundColor red }
}