Я использую скрипт powershell, который нашел в сети, пытаясь использовать процессор win7 для удаленной смены паролей на Windows Server 2008 через RSAT. Прямо сейчас сервер 2008 и win7 являются виртуальными машинами, а процессор win7 доменирован на сервере и может правильно запускать модуль Active Directory для powershell. Я новичок в powershell и работе с серверами [этот проект — мое обучение на стажировке], и я получаю ошибку при попытке скомпилировать этот скрипт.
import-Module ActiveDirectory
Function Set-AdUserPwd
{
Param(
[string]$user,
[string]$pwd
) #end param
$oUser = [adsi]"LDAP://$user"
$ouser.psbase.invoke("SetPassword",$pwd)
$ouser.psbase.CommitChanges()
} # end function Set-AdUserPwd
Set-AdUserPwd -user "cn=test,ou=Users,dc=ifrit,dc=local" -pwd P@ssword1
Exception calling "Invoke" with "2" argument(s): "There is no such object on the server.
"
At line:10 char:25
+ $ouser.psbase.invoke <<<< ("SetPassword",$pwd)
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
Я думал, что, возможно, «invoke» — это что-то только для powershell 3, но, прочитав статью на technet, я обнаружил, что это применимо и к powershell 2. У меня есть учетная запись в AD как «test», но я не уверен, является ли это фактическим общим именем (Имя: Test, Фамилия: Test, Имя для входа пользователя:[email protected]) Может ли кто-нибудь сказать мне, относится ли исключение к тому, что у меня неправильный CN, или это что-то совсем другое?
решение1
Согласен с комментариями выше.
Вы можете опустить ссылки на ADSI (Active Directory Scripting Interface), так как это «старый» способ решения задач; модуль Active Directory PS был разработан для его замены.
Итак, в вашем случае вам сначала нужно подтвердить, что объект пользователя существует. Вы можете сделать это с помощьюПолучить-ADUsercmdlet, основанный на выбранных вами критериях поиска. Теперь, на этом этапе, я бы предложил сделать поиск достаточно предписывающим, то есть так, чтобы вы возвращали только один объект пользователя, например:
try {
$objUser = Get-ADUser -Filter { Name -eq $user }
//
// rest of code here
//
}
catch{
Write-Host "ERROR : Failed to locate user.";
}
Затем вы можете использоватьУстановить-ADAccountPasswordКомандлет для сброса пароля (см. гиперссылку). Для этого требуется Distinguished Name (DN) пользователя, который будет атрибутом вашего$objUserобъект, возвращенныйПолучить-ADUserвызов.
Я не могу проверить это отсюда, поэтому если вы попробуете это из интерактивной командной строки PowerShell, вы сможете увидеть, какие атрибуты существуют для вашего$objUserобъект:
$test = Get-ADUser -Filter { Name -eq "jimbob" }
$test | Get-Member
Я подозреваю, что естьДНилиDistinguishedNameатрибут, но, как я уже сказал, я не могу проверить это отсюда.
Попробуйте и сообщите нам о ходе работ, если вам понадобится дополнительная помощь...