首页 > 解决方案 > 为什么我的条件确定用户是否在一个组中总是返回为假?

问题描述

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

#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直接输入(大小写正确与否),当该用户是该组的成员时,它正确返回 true。

标签: powershellpowershell-5.0

解决方案


试试这个:

$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."
}

Out-StringonGet-ADGroupMember正在将您转换array为 astring这就是为什么您不能将其用作比较的原因:

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."
}
...
...

推荐阅读