为什么我的条件确定用户是否在组中总是 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
字符串
我正在编写一个脚本,需要检测执行用户帐户是否是域管理员。我通过获取当前用户并检查他们是否在 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
字符串