在 Powershell 中将备用凭据传递给 ADSI 命令

Passing Alternate Credential to ADSI Commands in Powershell

我正在尝试使用 powershell 脚本为 AD OU 分配权限,该脚本应该创建类型为 System.Security.Principal.NTAccountSystem.DirectoryServices.ActiveDirectoryAccessRule 的新对象,我现在拥有的代码无需备用凭据,但现在我需要使用具有备用凭据的相同代码。

没有备用凭据的工作代码:

$ADSI = [ADSI]"LDAP://$OUPath"

$NTAccount = New-Object System.Security.Principal.NTAccount($ClientGroupED)

$IdentityReference = $NTAccount.Translate([System.Security.Principal.SecurityIdentifier])

$ActiveDirectoryRights = [System.DirectoryServices.ActiveDirectoryRights] "GenericAll"

$AccessControlType = [System.Security.AccessControl.AccessControlType] "Deny"

$Inherit = [System.DirectoryServices.ActiveDirectorySecurityInheritance] "All"  #All, Children, Descendents, None, SelfAndChildren

$ACE = New-Object System.DirectoryServices.ActiveDirectoryAccessRule($IdentityReference,$ActiveDirectoryRights,$AccessControlType,$Inherit)

$ADSI.psbase.ObjectSecurity.SetAccessRule($ACE)

$ADSI.psbase.commitchanges()

我尝试使用 -Credential $Cred 传递备用凭据,并且在调用 New-Object 时也传递了 -ArgumentList $Cred 都不起作用。在这个问题上需要一些帮助。

您真正与 AD 交谈的唯一地方是 $ADSI.psbase.commitchanges()。因此,您唯一需要设置凭据的地方是在创建 $ADSI.

[ADSI] 类型加速器只是创建 DirectoryEntry object. DirectoryEntry does have a constructor that accepts credentials 的快捷方式,但要使用它,您不能再使用类型加速器了。您需要使用 New-Object,像这样:

$ADSI = New-Object System.DirectoryServices.DirectoryEntry("LDAP://$OUPath", "username", "password")

只需将 usernamepassword 替换为有权执行您正在执行的操作的凭据。

如果您希望脚本调用 Get-Credential 并使用用户输入的任何凭据,那么您可以使用解决方案 here.

旁注:您不需要在最后两行中使用 psbase。如果你愿意,你可以,但这没有任何功能上的区别。你可以不用:

$ADSI.ObjectSecurity.SetAccessRule($ACE)

$ADSI.CommitChanges()

您也可以直接在 ADSI 对象上设置凭据。我已经测试过这个来为用户设置终端服务属性。

$ADSI = [ADSI]("LDAP://" + $userdn)
$ADSI.psbase.Username = $credential.username
$ADSI.psbase.Password = $credential.GetNetworkCredential().Password 

//get the value of a property
$output["property"] = $ADSI.psbase.InvokeGet("Property")

//set the value of a property
$ADSI.psbase.InvokeSet("Property", "your value")
$ADSI.CommitChanges()