为什么我的条件确定用户是否在组中总是 returns 为假?

How come my condition determining if a user is in a group always returns as false?

我正在编写一个脚本,需要检测执行用户帐户是否是域管理员。我通过获取当前用户并检查他们是否在 Domain Admins 安全组中来做到这一点。

#Get current user
$CurrentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name | Out-String
$CurrentUser = $CurrentUser -replace 'DOMAIN\' 

#Get list of Domain Admins members
$DomainAdmins = Get-ADGroupMember -Identity "Domain Admins" -Recursive | Select -ExpandProperty SamAccountName | Out-String

#Relevant condition
If ($DomainAdmins -like ($CurrentUser)) {
     Write-Output "You're a domain admin." #example
}
Else {
     Write-Output "You're not a domain admin."
}

从我们的域控制器使用域管理员帐户 运行 时,此脚本始终 运行 是 Else 代码。

我也尝试过使用 -contains.contains() 得到完全相同的结果。我已验证 $CurrentUser 值准确代表当前用户,并且 $DomainAdmins 列出了预期的用户列表。

我也可以这样做:

if ($DomainAdmins -contains ("USERNAME")) {Write-host "true"}

其中 USERNAME 是直接输入的当前用户(是否区分大小写),并且当该用户是组成员时 returns 正确。

试试这个:

$userSID = [System.Security.Principal.WindowsIdentity]::GetCurrent().User.Value

$DomainAdmins = Get-ADGroupMember -Identity "Domain Admins" -Recursive

if($DomainAdmins.SID.Contains($userSID))
{
     Write-Output "You're a domain admin."
}
...

# OR 

if($userSID -in $DomainAdmins.SID)
{
     Write-Output "You're a domain admin."
}
...

# OR

if($DomainAdmins.SID -contains $userSID)
{
    Write-Output "You're a domain admin."
}

Get-ADGroupMember 上的 Out-String 正在将您的 array 转换为 string,这就是您不能将其用作比较的原因:

PS /> @(
    'one'
    'two'
    'three'
) -contains 'one'
True

PS /> (@(
    'one'
    'two'
    'three'
) | Out-String) -contains 'one'
False

替代方法,而不是使用 Get-ADGroupMember

$userSID = [System.Security.Principal.WindowsIdentity]::GetCurrent().User.Value

$domainAdminsDN = (Get-ADGroup -Identity "Domain Admins").DistinguishedName
$recursiveMembers = Get-ADUser -LDAPFilter "(memberOf:1.2.840.113556.1.4.1941:=$domainAdminsDN)"

if($recursiveMembers.SID.Contains($userSID))
{
    Write-Output "You're a domain admin."
}
...
...

我的首选方法是检查用户的 MemberOf 属性。当您有多个域或其他奇怪的情况时,将它们保留为 AD 对象会更好一些:

# check if DA
$DAdn = (Get-ADGroup 'Domain Admins').distinguishedname
If ( Get-ADUser -LDAPFilter "(&(SamAccountName=$Env:USERNAME)(MemberOf:1.2.840.113556.1.4.1941:=$DAdn))" ) {
    Write-Output "You're a domain admin." #example
}

您的 $DomainAdmins 变量是一个包含成员而不是列表对象的字符串。使用 ... | Select -ExpandProperty SamAccountName 足以在没有 Out-String.

的情况下获得您的列表

-contains 在集合中查找完全匹配,而不是子字符串。

您必须从 $DomainAdmins 中删除 Out-String,使其成为一个列表并确保名称完全匹配,或者使用 .Contains(...)$DomainAdmins 字符串