使用 Powershell 和 .NET 设置 'UserAccountControl'

Setting 'UserAccountControl' using Powershell and .NET

我正在编写 Powershell 脚本以在 Active Directory 中创建用户帐户,我想使用凭据来完成此操作,因此我使用的是 .NET

$objDirectoryEntry = New-Object System.DirectoryServices.DirectoryEntry ($OU,$($Credential.UserName),$($Credential.GetNetworkCredential().password))
$Account = $objDirectoryEntry.psbase.get_children().add("CN="+$AccountName,"User")
$Account.psbase.InvokeSet("sAMAccountName",$sAMAccountName)
$Account.psbase.invokeset("DisplayName", $Displayname)
$Account.psbase.invokeset("Description", $Description)
$Account.psbase.CommitChanges()

似乎无法设置臭名昭著的 'UserAccountControl' 参数

$Account.psbase.invokeset(“userAccountControl”, 66048) #fails
$Account.psbase.invokeset(“userAccountControl”, 0x10200) #fails
$Account.psbase.invokeset(“userAccountControl”, 0x2) #fails

另一方面,使用 ADSI 包装器工作正常。

$objADSI = [ADSI]$AdminOU
$objAccount = $objADSI.create("User","CN="+$AccountName)

# Create the account
$objAccount.put("SamAccountName", $AccountName)
$objAccount.put("DisplayName", $Displayname)
$objAccount.put("Description", $Description)
$objAccount.SetInfo()

# set password
$objAccount.SetPassword($AdminAccountPassword)
$objAccount.SetInfo()

# set the userAccountControl
$objAccount.put(“userAccountControl”, 66048)
$objAccount.SetInfo()

但是在不同的凭据下无法将 ADSI 包装器方法获取到 运行。

花了太多时间在这个问题上,我能想到的唯一其他方法是开始将 ADSI 方法保存到外部脚本并使用凭据调用它,肯定有办法

我找到了一种将凭据放入 powershell ADSI 包装器的简单方法。

$objADSI = [ADSI]$LDAPPath
$objADSI.PsBase.Username = $UserName
$objADSI.PsBase.Password = $Password

使用 psbase 公开 System.DirectoryServices.DirectoryEntry .NET 对象的隐藏属性

然后您可以 return 使用通常的 powershell ADSI 包装器方法,一切正常。