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

z4iuyo4d  于 2023-04-06  发布在  Shell
关注(0)|答案(2)|浏览(132)

我试图分配权限AD OU的使用powershell脚本,应该创建一个新的对象类型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。在这个问题上需要一些帮助。

qpgpyjmq

qpgpyjmq1#

您实际与AD对话的唯一地方是在$ADSI.psbase.commitchanges()。因此,您需要设置凭据的唯一地方是在创建$ADSI时。
[ADSI]类型加速器只是创建DirectoryEntry对象的快捷方式。DirectoryEntry确实有一个接受凭据的构造函数,但要使用它,您不能再使用类型加速器。您需要使用New-Object,如下所示:

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

只需将usernamepassword替换为有权执行您正在执行的操作的凭据。
如果希望脚本调用Get-Credential并使用用户输入的任何凭据,则可以使用解决方案here
旁注:你不需要在最后两行使用psbase。如果你愿意,你可以使用,但它没有功能上的区别。你可以不使用:

$ADSI.ObjectSecurity.SetAccessRule($ACE)

$ADSI.CommitChanges()
dgiusagp

dgiusagp2#

您也可以直接在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()

相关问题