Как я, не являющийся администратором, могу изменить пароль моего активного каталога с помощью PowerShell, если мой компьютер не является членом домена? - PullRequest
0 голосов
/ 24 марта 2020

Я вошел на ноутбук как пользователь без домена.

Я подключен к удаленной сети с помощью Open VPN и могу получать доступ к ресурсам домена через эту VPN, например к общему ресурсу CIFS, путем ввода учетных данных моего домена при появлении запроса.

Я хочу используйте PowerShell для изменения пароля в удаленном домене.

Мои текущие учетные данные хранятся в виде $ credentials, объекта System.Management.Automation.PSCredential.

Мой новый пароль хранится как $ newPassword, защищенная строка,

Как я, не являющийся администратором, могу изменить пароль моего активного каталога с помощью PowerShell, если мой компьютер не является членом домена?

Полное доменное имя домен d0-ad.domain.com преобразуется в IP-адрес контроллера домена. Я добавил имя netb ios, NP-DOMAIN, в файл hosts, чтобы он также преобразовывался в контроллер домена.

Это часть скрипта, с которой у меня возникают проблемы:

Write-Verbose "Setting up DirectoryEntry object"
$DomainEntry = New-Object -TypeName System.DirectoryServices.DirectoryEntry "LDAP://$($netBiosName)" ,$credentials.UserName,$($credentials.GetNetworkCredential().password)

Write-Verbose "Setting up DirectorySearcher object"
$Searcher = New-Object -TypeName System.DirectoryServices.DirectorySearcher

$Searcher.SearchRoot = $DomainEntry

$userName = $($credentials.UserName).Replace("$($netBiosName)\","")
Write-Verbose "Username set as $($userName)"
$Searcher.Filter = "(samaccountname=$($userName))"

$user = $Searcher.FindOne()

$userObject = [ADSI]$user.Path

if ($userObject) {
    Write-Verbose "Changing password for user: $($user.Path)"
    $userObject.ChangePassword($credentials.GetNetworkCredential().password, [System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($NewPassword)))
} else {
    Write-Verbose "User $($username) not found"
    throw "User $($username) not found"
}

Проблема возникает в

$userObject = [ADSI]$user.Path

Если я пытаюсь получить доступ к $ userObject I получить сообщение об ошибке:

format-default: при извлечении члена «имя-различия» произошло следующее исключение: «Произошла локальная ошибка.» + CategoryInfo: NotSpecified: (:) [format-default], ExtendedTypeSystemException + FullyQualifiedErrorId: CatchFromBaseGetMember, Microsoft.PowerShell.Commands.FormatDefaultCommand

Я знаю, что учетные данные верны, и соединение с каталогом работает, потому что метод $ Searcher.FindOne () правильно ищет, находит, и возвращает правильного пользователя.

Так почему я получаю сообщение "Произошла локальная ошибка."?

1 Ответ

1 голос
/ 25 марта 2020

Ошибка кажется странной, но я думаю, что это, вероятно, потому что вы не даете ей надлежащие учетные данные. Ускоритель типа [ADSI] - это просто сокращение для создания объекта DirectoryEntry. Таким образом, [ADSI]$user.Path является эквивалентом создания DirectoryEntry, как вы сделали в верхней части кода, за исключением того, что без имени пользователя и пароля.

Так что вы можете:

  1. Создать как в верхней части вашего файла:
$userObject = New-Object -TypeName System.DirectoryServices.DirectoryEntry $user.Path, $credentials.UserName, $($credentials.GetNetworkCredential().password)

или

Звоните GetDirectoryEntry() на SearchResult. Для объекта DirectoryEntry, который он возвращает, будут установлены те же учетные данные, что и для SearchRoot:
$userObject = $user.GetDirectoryEntry()
...