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



使用PowerShell,我正在尝试获取具有远程桌面用户权限以登录服务器的用户/组列表。

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

ps c: users pal.test> net LocalGroup"远程桌面用户"别名名称 该组中的远程桌面用户注释成员被授予 登录权远程登录

成员


pal kron.pal
pal pal-vpn-clients
命令成功完成。

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

ps c: users pal.test> $ rdpusers = net localgroup"远程桌面 用户"

ps c: users pal.test>写入 - 宿主$ rdpusers

别名名称远程桌面用户注释成员 团体被授予登录远程成员的权利 -------------------------------------------------------------------------------------------------------------------------- kron.pal pal pal-vpn-client
命令成功完成。

对于其他命令,例如" get-wmiObject ",我会使用"当我尝试使用-expandproperty时,我使用此获取空白输出或错误:

ps c: users pal.test> net LocalGroup"远程桌面用户" |select -object -expandproperty成员

select-object:属性"成员"找不到。

在线:1 char:41

  • NET LOCALGROUP"远程桌面用户" |select -object -expandproperty成员

  • + 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 "的输出?

这也未经我在服务器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

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

我认为这将在2008年起作用,但无法测试。[腮红]

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

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

谢谢lee_dailey;您的解决方案非常接近我所需的内容。但是我发现Windows 2008上的PowerShell 2.0没有" Skiplast"选项作为" Select-Object"选项的一部分。

我确实使用了您的代码作为替代解决方案的基础,以避免使用Windows 2008上的PowerShell 2.0中的" Skiplast"选项。

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

最新更新