2014-01-22 5 views
1

До сих пор у меня есть следующий скрипт, который работает как шарм, но только список членов группы «Администраторы». Поскольку мои серверы могут быть немецкими, французскими ... У меня нет гарантии, что такая группа будет существовать с английским словом. Поэтому я хочу адаптировать его для сбора всех групп и ассоциированных членов, а не только для администраторов ... bummer Я застрял на определенном этапеПолучить все локальные элементы и группы, отображаемые вместе

В приведенном ниже сценарии перечислены все пользователи, которые находятся в непустых локальных группах. Однако я хотел бы получить в своем CSV также название группы, частью которой является пользователь, для более четких интерпретаций.

Может кто-нибудь помочь мне в этом? Я немного застрял и совершенно ничего.

$Servers=Get-Content ListOfComputers.txt 
$output = 'ListOfLocalAdministratorsGroup.csv' 
$results = @() 

foreach($server in $Servers) 
{ 
$admins = @() 
$computer =[ADSI]"WinNT://$server" 
$computer.psbase.children | where { $_.psbase.schemaClassName -eq 'group' } | foreach { 
$group =[ADSI]$_.psbase.Path 
$members = @($group.psbase.Invoke("Members")) 
$members | foreach { 
$obj = new-object psobject -Property @{ 
Server = $Server 
Admin = $_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null) 
} 
$admins += $obj 
}} 
$results += $admins 
} 
$results| Export-csv $Output -NoTypeInformation 

ответ

3

Локальная группа администраторов всегда будет иметь следующий SID: S-1-5-32-544 (засвидетельствованные в Well-known security identifiers in Windows operating systems.)

Таким образом, вы можете добавить следующую строку в ваш сценарий, чтобы получить правильный название группы:

$objSID = New-Object System.Security.Principal.SecurityIdentifier("S-1-5-32-544") 
$objgroup = $objSID.Translate([System.Security.Principal.NTAccount]) 
$objgroupname = ($objgroup.Value).Split("\")[1] 
+0

Здравствуйте Trondh, К сожалению я редактировал в то же время, потому что я изменил мой сценарий и почти получил это работает. Я попробую ваше решение и дам вам знать! :) – Wawa41

+0

Trondh, я попробовал ваш ответ, но я получаю сообщение «Не удалось найти имя группы» с помощью метода Invoke. – Wawa41

+0

Таким образом: $ objSID = New-Object System.Security.Principal.SecurityIdentifier ("S-1-5-32-544") $ objgroup = $ objSID.Translate ([System.Security.Principal.NTAccount]) $ objgroupname = $ objgroup.Value Еогеасп ($ сервер в $ серверов) { $ админы = @() $ группа = [ADSI] "WinNT: // $/сервер $ objgroupname" $ членов = @ ($ group.psbase.Invoke ("Members")) – Wawa41

1

Он работает как шарм с последним редактированием Trondh.

Вот последняя версия кода. Поэтому он соберет всех членов местной группы администраторов (независимо от языка, используемого для его названия)

Большое спасибо :) !!

#The Third section will query each computer in the ListOfComputers.txt to get the members of the local group Administrators 
$Servers=Get-Content ListOfComputers.txt 
$output = 'ListOfLocalAdministratorsGroup.csv' 
$results = @() 

$objSID = New-Object System.Security.Principal.SecurityIdentifier("S-1-5-32-544") 
$objgroup = $objSID.Translate([System.Security.Principal.NTAccount]) 
$objgroupname = ($objgroup.Value).Split("\")[1] 

foreach($server in $Servers) 
{ 
$admins = @() 
$group =[ADSI]"WinNT://$server/$objgroupname" 
$members = @($group.psbase.Invoke("Members")) 
$members | foreach { 
$obj = new-object psobject -Property @{ 
Server = $Server 
Admin = $_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null) 
} 
$admins += $obj 
} 
$results += $admins 
} 
$results| Export-csv $Output -NoTypeInformation 
+0

Привет всем, у меня такая же проблема с языками над моим доменом, но копирование/вставка этого скрипта дает мне ошибку с Invoke: Exception, вызывающий «Invoke» с аргументом «2»: «Имя группы не могло быть найденным." в $ objgroupname есть Администраторы и группа администратора. У меня есть список компьютеров в массиве серверов. Я что-то упустил? – Edwardo

Смежные вопросы