在 Powershell 中将备用凭据传递给 ADSI 命令
Passing Alternate Credential to ADSI Commands in Powershell
我正在尝试使用 powershell 脚本为 AD OU 分配权限,该脚本应该创建类型为 System.Security.Principal.NTAccount
和 System.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")
只需将 username
和 password
替换为有权执行您正在执行的操作的凭据。
如果您希望脚本调用 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()
我正在尝试使用 powershell 脚本为 AD OU 分配权限,该脚本应该创建类型为 System.Security.Principal.NTAccount
和 System.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")
只需将 username
和 password
替换为有权执行您正在执行的操作的凭据。
如果您希望脚本调用 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()