Пользователи и локальные группы сообщают, используя Powershell? - PullRequest
11 голосов
/ 09 июня 2009

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

Ответы [ 4 ]

13 голосов
/ 10 июня 2009

На самом деле вы можете использовать ярлык типа 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
}
7 голосов
/ 09 июня 2009

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

Получить локальные группы

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

Получить членов локальной группы

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;
    }
  }
}
1 голос
/ 18 апреля 2016

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

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 голосов
/ 21 июня 2015

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

$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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...