2017-02-22 3 views
0

Я использую следующую Powershell от http://iislogs.com/steveschofield/2009/01/09/list-local-administrators-on-a-machine-using-powershell-adsi/, чтобы извлекать учетные записи локальных и доменных администраторов, настроенные на ПК и серверах внутренней сети.Powershell для размещения локальных администраторов в сети

Powershell скрипт ниже:

function LogToFile ([string]$strFileName, [string]$strComputer) 
{ 
Add-Content $strFileName $strComputer 
} 

$strComputer = “server1.loc.mydomain.com” 
$computer = [ADSI](“WinNT://” + $strComputer + “,computer”) 
$Group = $computer.psbase.children.find(“Administrators”) 
$members= $Group.psbase.invoke(“Members”) | %{$_.GetType().InvokeMember(“Name”, ‘GetProperty’, $null, $_, $null)} 

ForEach($user in $members) 

{ 
Write-Host $user 
$a = $strComputer + “!” + $user.ToString() 
LogToFile “C:\local-admins.txt” $a 
} 

При выполнении он дает результаты в текстовом файле в следующем формате:

server1.loc.mydomain.com!Administrator 
server1.loc.mydomain.com!JohnDoe 
server1.loc.mydomain.com!Support 
server1.loc.mydomain.com!Domain Administrators 
  1. Может кто-то помочь мне изменить выход на TXT файл, поэтому результаты показаны в таком формате:

    server1.loc.mydomain.com!Administrator!JohnDoe!Support!Domain Administrators 
    

Если сообщается таким образом, то я могу легко экспортировать в csv и работать с ним. Было бы здорово, если это можно преобразовать для экспорта в CSV в желаемом формате вместо txt.

  1. Как сделать код в строке 6 так, например, если я хочу отсканировать всю подсеть с именами: server1, server2, ... server38 ... Мне не нужно вручную изменять эту строку для каждой машины. Я пробовал сервер *, сервер [*], и это дает мне ошибки.

Я полный новичок в PS, но пытаюсь объединить вещи для удовлетворения моих потребностей и надеюсь, что вы можете предоставить мне необходимую помощь.

Спасибо.

+0

'$ a = @ ($ strComputer; $ members) -join '!'' –

+0

Это почти что. Но теперь он производит желаемый вывод в тех же строках, в зависимости от количества администраторов. Например. если есть 4 админа, выходной файл (the> добавляются только для более четкого акцента) > server1.loc.mydomain.com! Администратор! JohnDoe! Поддержка! Администраторы домена > server1.loc.mydomain.com! Администратор ! JohnDoe! Поддержка! Администраторы домена > server1.loc.mydomain.com! Administrator! JohnDoe! Поддержка! Администраторы домена > server1.loc.mydomain.com! Administrator! JohnDoe! Поддержка! Администраторы домена – valdroni

+0

Удалите весь ' foreach() {} 'loop, просто сделайте это один раз –

ответ

1

Чтобы изменить выход, чтобы иметь все учетные записи в одной строке, изменить цикл foreach() на дне просто:

$a = @($strComputer;$members) -join '!' 
LogToFile "C:\local-admins.txt" $a 

Для создания списка серверов с последовательными номерами в их имени, используйте оператор диапазона ..:

$serverNames = foreach($number in 1..38){ 
    'server{0}' -f $number 
} 

Таким образом, вы в конечном итоге с чем-то вроде:

function LogToFile ([string]$strFileName, [string]$strComputer) 
{ 
    Add-Content $strFileName $strComputer 
} 

foreach($ServerNumber in 1..38){ 
    $ServerName = 'server{0}.loc.mydomain.com' -f $ServerNumber 
    $Computer = [ADSI]("WinNT://$ServerName,computer") 
    $Group = $Computer.psbase.children.Find('Administrators') 
    $Members= $Group.psbase.invoke('Members') |ForEach-Object { $_.GetType().InvokeMember('Name', 'GetProperty', $null, $_, $null) } 

    $Output = @($ServerName;$members) -join '!' 
    LogToFile 'C:\local-admins.txt' $Output 
} 
+0

* неправильно нажал кнопку «Изменить» выше. В код @Mathias не внесены изменения. благодаря – valdroni

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