使用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 ”的输出?
答案 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