PowerShell过滤远程桌面用户组的输出

时间:2019-02-14 02:20:51

标签: powershell

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

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

  

PS C:\ Users \ pal.test> net localgroup“远程桌面用户”别名   远程桌面用户评论该组的成员被授予   远程登录的权利

     

会员

     
     

PAL \ kron.pal
  PAL \ PAL-VPN-客户端
  命令成功完成。

但是,如果我运行此命令并输出到变量,则会得到所有标题:

  

PS C:\ Users \ pal.test> $ RDPUsers =净本地组“远程桌面   用户”

     

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

     

别名(Alias name)远程桌面用户评论此成员   组被授予远程登录成员的权利   -------------------------------------------------- ----------------------------- PAL \ kron.pal PAL \ PAL-VPN-Client
  命令成功完成。

对于“ Get-WMIObject ”之类的其他命令,我将利用“ | Select-Object -ExpandProperty成员”来过滤属性并仅选择属性值。当我尝试使用-ExpandProperty时,我会用它得到空白输出或错误:

  

PS C:\ Users \ pal.test> net localgroup“远程桌面用户” |选择对象-ExpandProperty成员

     

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

     

第1行:char:41

     
      
  • net localgroup“远程桌面用户” |选择对象-扩展属性成员

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

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

如果没有,如何过滤“ net localgroup ”的输出?

3 个答案:

答案 0 :(得分:0)

我认为这将在2008年生效,但无法对其进行测试。 [脸红]

$NET_LocalGroupInfo = net localgroup users |
    Select-Object -Skip 6 |
    Select-Object -SkipLast 2 |
    ForEach-Object {
        $_.Trim()
        }

$NET_LocalGroupInfo

我不知道何时添加-Skip*参数。如果在目标系统上失败,请尝试使用数组索引仅获取所需的索引。

答案 1 :(得分:0)

我在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

答案 2 :(得分:0)

感谢Lee_Dailey;您的解决方案非常接近我的需求。但是我发现Windows 2008上的PowerShell 2.0没有“ skiplast”选项作为“选择对象”选项的一部分。

我确实使用您的代码作为替代解决方案的基础,以避免Windows 2008的PowerShell 2.0中不提供'skiplast'选项。

PS C:\Users\pal.test> net localgroup "Remote Desktop Users" | where {$_ -AND $_ -notmatch "command completed successfully"} | select -skip 4
PAL\kron.pal
PAL\PAL-VPN-Client