【问题标题】:Windows PowerShell Command To List Group Members - Fine-Tuning列出组成员的 Windows PowerShell 命令 - 微调
【发布时间】:2021-07-13 21:03:53
【问题描述】:

我制作了以下列出组成员的命令:

gwmi win32_group -filter 'Name="Administrators"'|%{$_.GetRelated('Win32_UserAccount')} | select Name

上面的命令可以运行,但是需要很长时间才能完成,有没有办法微调上面的命令,让它运行得更快?

请注意,我仅限于 PowerShell 2.0。

编辑: 似乎上面的命令也在查询所有 DC 帐户。如何只查询本地用户?

【问题讨论】:

  • 如果您已加入域,那么您的查询将尝试查询域用户和组,GetRelated() 方法也是如此。这是一个臭名昭著的性能瓶颈。您可以尝试使用Get-WmiObject -ClassName Win32_Group -Filter "Name='Administrators' and Domain='$env:computername'" 将其过滤到本地帐户,但我认为GetRelated() 会做同样的事情。我不记得$env:computername 是否适用于 PSv2,但它只是主机名。
  • 您是对的,该命令还查询域用户!我已经尝试测试您仅查询本地用户的建议,但是,我没有成功,该命令似乎只列出了组名而不列出其用户成员,我做错了什么吗? Get-WmiObject -ClassName Win32_Group -Filter "Name='Administrators' and Domain='$env:computername'" |选择名称

标签: windows powershell wmi powershell-2.0 get-wmiobject


【解决方案1】:

调整

您的管道中缓慢的部分是.GetRelated() 的调用,因为这将评估 WMI 类实例的关联,这可能是巨大的列表。因此,您必须小心并尽可能过滤。你可以这样做:

(Get-WmiObject -Class Win32_Group -Filter "LocalAccount = TRUE and SID = 'S-1-5-32-544'").GetRelated("Win32_Account", "Win32_GroupUser", "", "", "PartComponent", "GroupComponent", $false, $null) | Select-Object -Property Name

注意,我使用 Administrators 组的知名 SID 来查找它,因为它的名称在其他语言中可能不同。我还查询了 Win32_Account 而不是 Win32_UserAccount 以真正返回 Administrators 组的所有成员,其中可能包括其他组,而不仅仅是用户帐户。当然,您可以根据自己的需要进行更改。您可以在this article 中阅读有关此调整的更多信息。

不同的方法

  1. 另一种方法是在一个 WMI 查询中定义所有内容:

    Get-WmiObject -Query "ASSOCIATORS OF {Win32_Group.Domain='$env:COMPUTERNAME',Name='Administrators'} WHERE AssocClass=Win32_GroupUser ResultRole=PartComponent" | Select-Object -Property Name
    
  2. 此外,您可以使用net 工具查询Administrators 组的成员:

    net localgroup Administrators
    

    缺点:您必须解析文本输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 2017-02-05
    • 2018-03-14
    • 1970-01-01
    相关资源
    最近更新 更多