首页 > 解决方案 > PowerShell 过滤远程桌面用户组的输出

问题描述

利用 PowerShell 我试图获取具有远程桌面用户权限以便能够登录到服务器的用户/组的列表。

我可以利用“ net localgroup”来获取具有远程桌面用户权限的组/用户列表:

PS C:\Users\pal.test> net localgroup "Remote Desktop Users" 别名 Remote Desktop Users Comment 该组的成员被授予远程登录的权限

成员


PAL\kron.pal
PAL\PAL-VPN-Clients
命令成功完成。

但是,如果我运行这个命令并输出到一个变量,我会得到所有的标题:

PS C:\Users\pal.test> $RDPUsers = net localgroup "远程桌面用户"

PS C:\Users\pal.test> 写入主机 $RDPUUsers

别名 远程桌面用户 评论 该组中的成员被授予远程登录的权限 成员 ------------------------------- ------------------------------------------------ 朋友\ kron.pal PAL\PAL-VPN-Client
命令成功完成。

对于“ Get-WMIObject ”等其他命令,我将使用“ | Select-Object -ExpandProperty Members过滤属性并仅选择属性值。但是,如果我使用它,当我尝试使用时会得到空白输出或错误 -展开属性:

PS C:\Users\pal.test> net localgroup "远程桌面用户" | Select-Object -ExpandProperty 成员

选择对象:找不到属性“成员”。

在行:1 字符:41

  • net localgroup "远程桌面用户" | Select-Object -ExpandProperty 成员

  • + CategoryInfo          : InvalidArgument: (Alias name     Remote Desktop Users:PSObject) [Select-Object], PSArgumentException
    
    + FullyQualifiedErrorId ExpandPropertyNotFound,Microsoft.PowerShell.Commands.SelectObjectCommand
    

有没有比使用“ net localgroup ”更好的方法来列出 Windows Server 2008/2012/2016 中的用户/组?

如果不是,你如何过滤“ net localgroup ”的输出?

标签: powershell

解决方案


我在 Server 2008/2012/2016 上也没有对此进行测试,但它可能会有所帮助:

function Get-LocalGroupMembers {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory = $true, Position = 0)]
        [String]$Identity,
        [String]$ComputerName = $env:COMPUTERNAME
    )

    Add-Type -AssemblyName System.DirectoryServices.AccountManagement 
    $context = New-Object DirectoryServices.AccountManagement.PrincipalContext('Machine', $ComputerName)

    try {
        if (!([string]::IsNullOrEmpty($Identity))) {
            # search a specific group
            [DirectoryServices.AccountManagement.GroupPrincipal]::FindByIdentity($context, $Identity)
        }
        else {
            # search all local groups
            $groupPrincipal    = New-Object DirectoryServices.AccountManagement.GroupPrincipal($context)
            $principalSearcher = New-Object DirectoryServices.AccountManagement.PrincipalSearcher($groupPrincipal)
        }
    }
    catch {
        throw "Error searching group(s) on '$ComputerName'. $($_.Exception.Message)"
    }
    finally {
        if ($groupPrincipal)    {$groupPrincipal.Dispose()}
        if ($principalSearcher) {$principalSearcher.FindAll()}
    }
}

(Get-LocalGroupMembers -Identity "Remote Desktop Users").Members | Select-Object -ExpandProperty Name

使用上述函数,您将获得具有各种属性的返回对象。在此示例中,我仅选择了 Name 属性。如果要查看所有属性,只需删除| Select-Object -ExpandProperty Name


推荐阅读