Составление запроса ADSI LDAP
Я ищу в активном каталоге пользователей в определенной организационной единице, которые я хотел бы изменить с помощью ADSI.
# get all users from the organizational unit
$accounts = Get-ADObject -filter 'objectClass -eq "user"' -SearchBase $dsn
# iterate over user objects
foreach ($account in $accounts) {
# unfortunately we have to use ADSI over the set-aduser cmdlet as we neeed to touch remote desktop attribues
$user = [ADSI]"LDAP://" + ($account.DistinguishedName).ToString()
# get logon name
$SamAccountName = $user.psbase.InvokeGet("SamAccountName")
# Profile Attributes
$user.psbase.InvokeSet("ProfilePath", "")
$user.psbase.InvokeSet("ScriptPath", "DIR\Logon.cmd")
$user.psbase.InvokeSet("HomeDrive", "H:")
$user.psbase.InvokeSet("HomeDirectory", "\\host\users$\${SamAccountName}")
# Remote Desktop Services Attributes
$user.psbase.InvokeSet("TerminalServicesProfilePath", "")
$user.psbase.InvokeSet("TerminalServicesHomeDirectory", "\\host\users$\${SamAccountName}")
$user.psbase.InvokeSet("TerminalServicesHomeDrive", "H:")
# Write attributes back to global catalog
$user.SetInfo()
}
Это все работает нормально, пока не доходит до $user = [ADSI]"LDAP://" + ($account.DistinguishedName).ToString()
часть.
Method invocation failed because [System.DirectoryServices.DirectoryEntry] does not contain a method named 'op_Addition'.
At \\tsclient\D\SourceCode\PowerShell\Set-ADUserAttributes.ps1:37 char:5
+ $user = [ADSI]"LDAP://" + ($account.DistinguishedName).ToString()
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (op_Addition:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
Exception calling "InvokeGet" with "1" argument(s): "Unspecified error
"
At \\tsclient\D\SourceCode\PowerShell\Set-ADUserAttributes.ps1:40 char:5
+ $SamAccountName = $user.psbase.InvokeGet("SamAccountName")
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
Похоже, что запрос не выполняется. Тем не мение, $account.DistinguishedName
содержит правильный путь LDAP (который я проверил вручную).
Так что я тут не так делаю?
2 ответа
Вы пытаетесь добавить объект ADSI, приведя "LDAP://" к [ADSI] перед выполнением добавления.
Сначала следите за своими строками, а затем выполняйте приведение:
$user = [ADSI]("LDAP://" + $account.DistinguishedName)
Операция приведения имеет более высокий приоритет, чем операция конкатенации, поэтому вам нужно выполнить конкатенацию в подвыражении, например, так:
[adsi]("LDAP://" + $account.DistinguishedName)
или вот так:
[adsi]"LDAP://$($account.DistinguishedName)"
Отличительное имя здесь автоматически преобразуется в строку, поэтому вам не нужно вручную вызывать ToString()
,