Архив

Archive for Сентябрь 2017

PS скрипт для выгрузки членов локальных групп безопасности

4 сентября, 2017 2 комментария

Зафиксирую для себя небольшой скрипт на PowerShell для получения членов локальных групп безопасности.

Регулярно в рамках аудита или миграции, всплывает задача быстро получить членов всех групп безопасности локального компьютера, со следующими входными данными:

  1. уровень вложенности групп = 1 (нет необходимости раскрывать все вложенные группы до объекта)
  2. для каждого члена группы указать признаки: (группа или нет), (УЗ локальная или доменная)
  3. формат вывода в CSV (Excel) для последующего анализа (Сводные таблицы), на выходе должно получиться:

 
"Computername"; "ParentGroup"; "NameMember"; "TypeMemeber"; "PathMember"; "isGroupMemeber"; "Depth"
"WS-1"; "Администраторы"; "Администратор"; "Local"; "WinNT://WORKGROUP/WS-1/Администратор"; "False"; "1"
"WS-1"; "Пользователи"; "Domain Users"; "Domain"; "WinNT://TEST/Domain Users"; "True"; "1"
"WS-1"; "IIS_IUSRS"; "IUSR"; "Local"; "WinNT://NT AUTHORITY/IUSR"; "True"; "1"
 
 
Получился небольшой скрипт на PowerShell версии 2 и выше.
 
— Обследуемый компьютер, по умолчанию локальный: строка 4 ($strComputer = gc env:computername)
 
— Путь к целевому файлу задается в строке 49 (C:\LocalGroups). По умолчанию это диск С:, пример имени файла LocalGroups(FS)-201704241037.csv
 

Trap {"Error: $_"; Break;}
 
# Здесь задаем имя компа, по умолчанию текущий комп
$strComputer = get-content env:computername
Write-Host "Computer: $strComputer"
$computer = [ADSI]"WinNT://$strComputer"
$objCount = ($computer.psbase.children | measure-object).count
Write-Host "Q-ty objects for computer '$strComputer' = $objCount"
$Counter = 1
$result = @()
foreach($adsiObj in $computer.psbase.children)
{
  switch -regex($adsiObj.psbase.SchemaClassName)
    {
       "group"
       {
         $group = $adsiObj.name
         $LocalGroup = [ADSI]"WinNT://$strComputer/$group,group"
         $Members = @($LocalGroup.psbase.Invoke("Members"))
         $objCount = ($Members | measure-object).count
         Write-Host "Q-ty objects for group '$group' = $objCount"
         $GName = $group.tostring()
        
         ForEach ($Member In $Members) {
           $Name = $Member.GetType().InvokeMember("Name", "GetProperty", $Null, $Member, $Null)
           $Path = $Member.GetType().InvokeMember("ADsPath", "GetProperty", $Null, $Member, $Null)
           Write-Host "  Object = $Path"
          
           # Check if this member is a group.
           $isGroup = ($Member.GetType().InvokeMember("Class", "GetProperty", $Null, $Member, $Null) -eq "group")
           If (($Path -like "*/$strComputer/*") -Or ($Path -like "WinNT://NT*")) {
             $Type = "Local"
           } Else {$Type = "Domain"}
           $result += New-Object PSObject -Property @{
             Computername = $strComputer
             NameMember = $Name
             PathMember = $Path
             TypeMemeber = $Type
             ParentGroup = $GName
             isGroupMemeber = $isGroup
             Depth = $Counter
           }
         }
       }
   } #end switch
} #end foreach
Write-Host "Total objects = " ($result | measure-object).count
$result = $result | select-object Computername, ParentGroup, NameMember, TypeMemeber, PathMember, isGroupMemeber, Depth
$result | Export-Csv -path ("C:\LocalGroups({0})-{1:yyyyMMddHHmm}.csv" -f $env:COMPUTERNAME,(Get-Date)) -Delimiter ";" -Encoding "UTF8" -force -NoTypeInformation