使用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