【问题标题】:Powershell not returning expected groupsPowershell 未返回预期组
【发布时间】:2018-02-23 16:40:54
【问题描述】:

我正在尝试在 Powershell 中使用以下代码来获取当前用户的 Active Directory 组,以便我可以根据用户所属的组执行特定操作。代码如下:

$id = [Security.Principal.WindowsIdentity]::GetCurrent()
$groups = $id.Groups | foreach-object {
 $_.Translate([Security.Principal.NTAccount])
}
$groups

但是,此代码不会显示用户所属的所有 Active Directory 组。我知道 WindowsIdentity.Groups 不会返回所有组,不包括仅拒绝令牌上的组或此处记录的 SE_GROUP_LOGON_ID 组:https://blogs.msdn.microsoft.com/shawnfa/2008/02/07/which-groups-does-windowsidentity-groups-return/

我希望通过使用 net user \domain 从域控制器获取成员所属的组列表来获取命令提示符中返回的所有组。我不介意是否包含更多组,但至少所有使用 net user 命令显示的域控制器组都需要存在。我还尝试了另一种在 Powershell 中检索组名的方法(如下)。它返回的另一组组仍然不同于域控制器使用 net user 返回的组,也不同于上面的第一种方法:

$strName = $env:username
$strFilter = "(&(objectCategory=User)(samAccountName=$strName))"

$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.Filter = $strFilter

$objPath = $objSearcher.FindOne()
$objUser = $objPath.GetDirectoryEntry()
$objUser.memberOf

任何可以为我提供包含在命令提示符中使用 net user 命令返回的所有组的列表的帮助将不胜感激。理想情况下,我正在寻找一个优雅的解决方案,例如我上面的第一个 sn-p 代码,它将组作为对象返回。我正在考虑直接在 Powershell 中从 net user 命令的输出中解析出组的名称,但在我这样做之前,我想确保我不会错过更优雅的解决方案。

【问题讨论】:

  • 你可以在 powershell 中运行 net user /domain

标签: powershell active-directory


【解决方案1】:

您可以像这样使用System.DirectoryServices.AccountManagement 命名空间:

[System.Reflection.Assembly]::LoadWithPartialName("System.DirectoryServices.AccountManagement")
[System.DirectoryServices.AccountManagement.UserPrincipal]::get_Current().GetAuthorizationGroups()

【讨论】:

  • 这行得通,我永远是伟大的。太慢了,你不知道解决速度问题的方法吗?
【解决方案2】:

这里有几种方法可以攻击这种努力。

使用 DOS 命令,但是你必须将它们变成对象并提取你想要的东西。

gpresult /V /user $env:USERNAME
whoami /GROUPS
net user $env:USERNAME /Domain

PoSh,只需执行以下操作... 这会获取所有用户,但您当然可以过滤您想要的任何用户名。

### Show User and AD group membership

# Get users with all their properties and their group membership, display user and group name
 ForEach ($TargetUser in (Get-ADUser -Filter * -Properties *))
 {
 "`n" + "-"*12 + " Showing group membership for " + $TargetUser.SamAccountName
 Get-ADPrincipalGroupMembership -Identity $TargetUser.SamAccountName `
 | Select Name
 }

# Get users with base properties and their group membership, display user and group name
 ForEach ($TargetUser in (Get-ADUser -Filter *))
 {
 "`n" + "-"*12 + " Showing group membership for " + $TargetUser.SamAccountName
 Get-ADPrincipalGroupMembership -Identity $TargetUser.SamAccountName `
 | Select Name
 }

# Get user and AD group info, display user and group name
 Get-ADUser -Filter "*" -SearchBase "CN=Users,DC=contoso,DC=com" `
 -SearchScope OneLevel -Properties Name, MemberOf `
 | Select-Object Name, @{Label="Memberof";
 expression={($_.memberof `
 | Get-ADGroup `
 | Select-Object -ExpandProperty Name) -Join ","}}

Get-ADUser -Filter "*" -SearchBase "CN=users,DC=contoso,DC=com" `
-SearchScope OneLevel -Properties Name, MemberOf |
 Select-Object Name, @{Label="Memberof";
 expression={($_.memberof | Get-ADGroup `
 | Select-Object -ExpandProperty Name) -Join ","}} `
 | Format-List

当然根据需要格式化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 2022-07-10
    • 2020-07-28
    • 2016-08-14
    • 2020-07-14
    • 2013-09-04
    • 2016-02-13
    相关资源
    最近更新 更多