Использование Powershell (RSAT) для сброса паролей в AD (Win Server 2008)

Использование Powershell (RSAT) для сброса паролей в AD (Win Server 2008)

Я использую скрипт 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атрибут, но, как я уже сказал, я не могу проверить это отсюда.

Попробуйте и сообщите нам о ходе работ, если вам понадобится дополнительная помощь...

Связанный контент