如何通过PowerShell脚本获取本地用户的组?

时间:2014-01-22 10:43:21

标签: powershell

我可以使用以下脚本获取本地组的成员:

$CompStat = Get-WmiObject win32_computersystem;
$Localhst = $CompStat.Name;
$Computer = [ADSI]('WinNT://'+$localhst+',computer');
$group = [ADSI]('WinNT://'+$Localhst+'/groupname,group');
$Members = @($group.psbase.Invoke("Members"));
$Members | ForEach-Object {$MemberNames += $_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null);
 Write-Output $MemberNames;
}

类似地如何获取特定用户的组?

3 个答案:

答案 0 :(得分:1)

虽然编写了一些自动化文件 - 为给定用户获取显式本地组而不遍历所有可用组:

<script>
  Your code here
</script>

通过ADSI WinNT(本地)从用户 SomeUserName 获取群组集合,请参阅以下行:$ User.psbase.Invoke(“团体“)在中间。最后两行提供了获取&amp; amp;打印出结果

答案 1 :(得分:1)

冒着为我赢得另一个死灵法师-徽章的风险,我想提供更多最新信息和更多惯用的代码来回答这个问题。

Get-LocalGroup |
    Where-Object { (Get-LocalGroupMember $_).name -eq "$env:COMPUTERNAME\$env:USERNAME" }

$env:USERNAME当然可以用任何其他用户名代替。


在数组中使用-eq-match之类的运算符使数组在上面的示例中显得不那么明显,因为它们返回的数组(如果为空,则等于数组中的$false)布尔上下文,否则为$true(如果运算符返回$true,则运算符将应用于每个项目,并且该项目将成为结果数组的一部分):

@(1;2;3) -eq 2  # =>  @(2)
@(1;2;3) -eq 4  # =>  @()
@(1;2;3) -ge 2  # =>  @(2;3)

此处发生的Powershell- array-magic 的另一个示例是,在不是数组对象的 member 的数组对象上调用的方法在该对象的每个项目上,返回值是不是$null的各个返回值组成的数组。因此,例如(Get-LocalGroup).sid.value返回的字符串数组如下:

S-1-5-32-544
S-1-5-32-545
S-1-5-32-546
...

我希望这能以一种易于理解的方式解释(Get-LocalGroupMember $_).name部分。


所有用户及其组:

Get-LocalUser |
    ForEach-Object {
        $nm = $_.name
        [pscustomobject]@{
            Name = $nm
            Groups = Get-LocalGroup |
                Where-Object { (Get-LocalGroupMember $_).name  -contains "$env:COMPUTERNAME\$nm" } |
                ForEach-Object name 
         }
    }

答案 2 :(得分:0)

要获取用户所属的全局组列表,您可以使用“net user username / dom”。我不知道显示给定用户的本地组成员身份的直接方法,但您可以使用已编写的脚本来执行此操作。

对于本地组中的用户成员资格,我在此处找到了一个脚本:Users and Local Groups Report using Powershell?

 $user = "insert test username"

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

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

直接将用户置于本地组中并不是一种好习惯。您应该将用户放入全局组,然后将全局组放入本地或域本地组,然后将权限分配给这些本地或域本地组。

例如参见:http://en.wikipedia.org/wiki/AGDLP