Назад | Перейти на главную страницу

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

Я использую сценарий PowerShell, который нашел в Интернете, пытаясь использовать процессор win7 для удаленного изменения паролей на Windows Server 2008 через RSAT. Прямо сейчас server 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, но, посмотрев статью о технологиях, говорится, что это применимо и к PowerShell 2. У меня есть учетная запись в AD как «тестовая», но я не уверен, что это фактическое общее имя (Имя: Тест, Фамилия: Тест, Имя для входа в систему: test@ifrit.local) Может ли кто-нибудь сказать мне, есть ли исключение имеет в виду, что у меня неправильный CN ИЛИ это что-то совсем другое?

Согласитесь с комментариями выше.

Вы можете отбросить ссылки на ADSI (интерфейс сценариев Active Directory), поскольку это «старый» способ работы; модуль Active Directory PS был разработан, чтобы заменить его.

Итак, в вашем случае вам сначала нужно подтвердить, что объект пользователя существует. Вы можете сделать это с помощью Get-ADUser командлет, основанный на выбранных вами критериях поиска. Теперь, на этом этапе, я бы предложил сделать поиск достаточно предписывающим, то есть вы возвращаете только один пользовательский объект, например:

try {
    $objUser = Get-ADUser -Filter { Name -eq $user }
    //
    // rest of code here
    //
    }
catch{
    Write-Host "ERROR : Failed to locate user.";
    }

Затем вы можете использовать Set-ADAccountPassword командлет для сброса пароля (см. гиперссылку). Для этого требуется отличительное имя (DN) пользователя, которое будет атрибутом вашего $ objUser объект, возвращенный Get-ADUser вызов.

Я не могу проверить это здесь, поэтому, если вы попробуете это из интерактивной командной строки PowerShell, вы увидите, какие атрибуты существуют для вашего $ objUser объект:

$test = Get-ADUser -Filter { Name -eq "jimbob" }
$test | Get-Member

Я подозреваю, что есть DN или DistinguishedName атрибут, но, как я уже сказал, отсюда я не могу проверить.

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