【问题标题】:net localgroup administrators equivalent in powershell等效于 PowerShell 中的 net localgroup 管理员
【发布时间】:2014-02-04 12:48:26
【问题描述】:

我已经通过 GPO 在我的所有桌面上配置了 winrm,因此我现在可以使用 invoke-command cmdlet 在远程计算机上本地运行命令。当我在本地机器上运行 net localgroup administrators 时,它可以工作并给我想要的东西。问题是我无法对这些数据做任何事情。我无法将结果传递给变量,因此我可以说删除特定帐户。

是否有内置的 cmdlet 可以让我执行与 net localgroup administrators 相同的操作?

【问题讨论】:

    标签: powershell local administrator


    【解决方案1】:

    虽然可以运行 net localgroup groupname 并解析其输出,但这并不是一种非常 PoSh 的方式。我建议改用WinNT provider

    $computers = 'HostA', 'HostB', 'HostC', ...
    $groupname = 'Administrators'
    
    $computers | % {
      $group = [ADSI]("WinNT://$_/$groupname,group")
      $group.PSBase.Invoke('Members') | % {
        $_.GetType().InvokeMember('Name', 'GetProperty', $null, $_, $null)
      }
    }
    

    如果你想使用Invoke-Command,你可以这样做:

    $computers = 'HostA', 'HostB', 'HostC', ...
    $groupname = 'Administrators'
    
    Invoke-Command -Computer $computers -ScriptBlock {
      $group = [ADSI]("WinNT://$env:COMPUTERNAME/$($args[0]),group")
      $group.PSBase.Invoke('Members') | % {
        $_.GetType().InvokeMember('Name', 'GetProperty', $null, $_, $null)
      }
    } -ArgumentList $groupname
    

    【讨论】:

    • 谢谢我已经有了这个脚本。我想为此使用 invoke-command cmdlet。
    【解决方案2】:

    您可以从输出中解析名称。

    这是一个使用 V4 的示例:

    (net localgroup administrators).where({$_ -match '-{79}'},'skipuntil') -notmatch '-{79}|The command completed'
    

    【讨论】:

    • 谢谢,这给了我正在寻找的东西,希望它更容易一点。
    【解决方案3】:

    使用任何版本的 PowerShell,您只需对要检查的任何机器执行以下操作:

    get-wmiobject -class Win32_Group -computer <computername>(, <computer2> ...)
    

    这将为您提供本地用户帐户。这也为您提供了 ManagementObjects,您可以根据需要使用它们来删除组,或者使用 PSv3 和 Windows Server 上安装的更新的附加 cmdlet(运行 get-module -list),您可以使用这可能更容易(但仍然使用 WMI 而不是 WinRM)。

    【讨论】:

    • 我有可以做到这一点的 WMI 脚本,但已经试图摆脱它。
    • 为什么? WMI(CIM,更是如此)在很大程度上是 PowerShell 的一部分。 PSv3 和 PSv4 中的更多功能添加了更多功能,这些功能都内置在 CIM/WMI 中。它不会消失,PS 也不是替代品。
    • 请注意,Win32_Group 不仅会列出本地组,还会列出域组。
    【解决方案4】:

    我想以@Ansgar Wiechers 的回答为基础。就我而言,仅获取每个用户的名称是不够的;我必须获取用户的域,以便查看用户帐户是本地帐户还是域帐户。

    我没有调用PSBase.Invoke('Members'),而是简单地调用了Members()。为了获得每个用户的路径,我使用[ADSI] 投射了对象,然后获得了Path 属性。这是我最终用来获取本地计算机上本地管理员组成员的代码:

    ([ADSI]"WinNT://localhost/Administrators,group").Members() | % { ([ADSI]$_).Path.Substring(8) }
    

    对于多台计算机,它看起来像这样:

    $computers = 'HostA', 'HostB', 'HostC', ...
    $computers | % {
        ([ADSI]"WinNT://$_/Administrators,group").Members() | % {
            ([ADSI]$_).Path.Substring(8)
        }
    }
    

    最后,我扩展了我的脚本以查询我域中的所有计算机,列出每台计算机上的本地管理员,并将所有结果导出到 XML 文件:

    Import-Module ActiveDirectory
    Get-ADComputer -Filter { enabled -eq $true } | % {
        $result = New-Object PSObject
        Add-Member -InputObject $result -MemberType NoteProperty -Name "Name" -Value $_.Name
        $local_administrators = ([ADSI]"WinNT://$($_.Name)/Administrators,group").Members() | % { ([ADSI]$_).Path.Substring(8) }
        Add-Member -InputObject $result -MemberType NoteProperty -Name "Local Administrators" -Value $local_administrators
        $result
    } | Export-Clixml "Local Administrators on Machines in the Domain.xml"
    

    您必须安装远程服务器管理工​​具才能执行Import-Module ActiveDirectory。对于 Windows 7 SP1,您可以转到 https://www.microsoft.com/en-us/download/details.aspx?id=7887 下载并安装工具,然后转到添加或删除 Windows 功能以启用它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-06
      • 1970-01-01
      • 1970-01-01
      • 2015-04-03
      • 2013-02-18
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      相关资源
      最近更新 更多