2009-06-09 2 views
10

Есть ли простой способ использования powershell для отображения всех локальных групп Windows, которые активны на машине, и пользователей, входящих в эти группы? Вторая часть этого вопроса будет заключаться в том, что его можно расширить, чтобы смотреть на несколько машин за раз.Отчеты пользователей и локальных групп с использованием Powershell?

ответ

13

На самом деле вы можете с типом ярлыка ADSI и прозвища WinNT. Вот пример списка групп и пользователей из вашей собственной машины:

$server="." 
$computer = [ADSI]"WinNT://$server,computer" 

$computer.psbase.children | where { $_.psbase.schemaClassName -eq 'group' } | foreach { 
    write-host $_.name 
    write-host "------" 
    $group =[ADSI]$_.psbase.Path 
    $group.psbase.Invoke("Members") | foreach {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)} 
    write-host 
} 
+0

Я получаю сообщение об ошибке с оператором $ group = [ADSI] $ _. Путь – msvcyc

+0

добавить psbase перед дорогой (т. Е. [ADSI] $ _. Psbase.Path) –

+0

omg спасибо, я бы никогда не нашел это сам! Есть ли способ узнать, являются ли члены локальной группы пользователем или группой? (я хочу перечислить членов администраторов локальной группы, и если член является domaingroup, список его членов) –

7

Powershell не имеет неотъемлемой поддержки такой функции. Однако легко скопировать команду «net localgroup» с помощью нескольких функций powershell и, таким образом, включить ее в конвейер.

Получить местные группы

function Get-LocalGroups() { 
    net localgroup | ?{ $_ -match "^\*.*" } | %{ $_.SubString(1) }; 
} 

членов Get Local Group

function Get-LocalGroupMembers() { 
    param ([string]$groupName = $(throw "Need a name")) 
    $lines = net localgroup $groupName 
    $found = $false 
    for ($i = 0; $i -lt $lines.Length; $i++) { 
    if ($found) { 
     if (-not $lines[$i].StartsWith("The command completed")) { 
     $lines[$i] 
     } 
    } elseif ($lines[$i] -match "^----") { 
     $found = $true; 
    } 
    } 
} 
+0

Петля должна сломаться попадает в строку «Команда завершена», иначе она вернет пустую строку в качестве последнего элемента массива, потому что последняя строка на выходе пустая. – bradvido

0

Ниже приводится улучшенным вариант сценария Shay Леви, который работает для местных групп с «бесхозными» счетами, которые SIDs не могут быть решены.

$server = "$env:COMPUTERNAME" 
$computer = [ADSI]"WinNT://$server,computer" 

$computer.psbase.children | where { $_.psbase.schemaClassName -eq 'group' } | foreach { 
    write-host $_.name 
    write-host "------" 
    $group =[ADSI]$_.psbase.Path 
    $group.psbase.Invoke("Members") | foreach {$_."GetType".Invoke().InvokeMember("Name", 'GetProperty', $null, $_, $null)} 
    write-host 
} 
1

ответ Джей Леви превратился в функцию :)

Function Get-LocalGroupMembers 
{ 
    Param(
     [string] 
     $server = "." 
    ) 
    Try 
    { 
     $computer = [ADSI]"WinNT://$($Server),computer" 
     $computer.psbase.children | 
      where { 
       $_.psbase.schemaClassName -eq 'group' 
      } | 
       ForEach { 
        $GroupName = $_.Name.ToString() 
        $group =[ADSI]$_.psbase.Path 
        $group.psbase.Invoke("Members") | 
         foreach { 
          $memberName = $_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null) -replace "WinNT:", "" 

          $props = @{ 
           "LocalGroup" = $GroupName 
           "MemberName" = $memberName 
          } 

          $obj = New-Object -TypeName psobject -Property $props 
          Write-Output $obj 
         } # foreach members 
       } # foreach group 
    } 
    Catch 
    { 
     Throw 
    } 
} 

Чтобы получить местные члены группы

Get-LocalGroupMembers 

Чтобы получить местных членов группы на другую машину

Get-LocalGroupMembers -Server $Computer 
+0

Как отредактировать эту функцию для вывода результатов в текст или файл csv? – salvationishere

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