Использование проблем ConvertTo-SecureString: Можно ли сбросить несколько паролей ADUC с помощью powershell? - PullRequest
1 голос
/ 09 июля 2019

простите за мое ржавое понимание программирования, в надежде, что кто-то может взглянуть на это и увидеть, где моя ошибка.У меня проблемы с попыткой массового сброса паролей в тестовом домене 2008 R2 с помощью Powershell.Я импортировал модуль AD в Powershell.У меня есть файл .csv, содержащий sAMAccountName (имена пользователей ADUC), и я импортирую его в powershell, назначая объект $ UserFile = "c: \ 2019StudentsB115.csv".Затем я использую цикл foreach, чтобы пройти и сбросить пароли для каждой учетной записи, но здесь всегда возникает ошибка.

Я попытался добавить пароль в файл .csv в качестве 2-го столбца, и это нене работаетЗатем я удалил 2-й столбец и удалил соответствующий код для паролей.Я пытался использовать ConvertTo-SecureString, чтобы дать общий пароль «Qwerty10» для всех этих учетных записей.Все эти учетные записи получают 1 общий пароль, и я не хочу, чтобы пользователь сбрасывал его при первом входе в систему.Я думал, что мог бы использовать цикл foreach, чтобы легко сделать это, но я получаю ошибки независимо от того, что я делаю.

Код, который я пробовал, выглядит следующим образом:

Попытка 1: бесконечный циклошибка "Невозможно связать аргумент со строкой, поскольку он имеет значение null"


foreach ($Account in $Resetpassword) {
    $Account.sAMAccountName
    $Account.Password
        Set-ADAccountPassword -Identity $Account.sAMAccountName -NewPassword (ConvertTo-SecureString $Account.Password -AsPlainText "Qwerty10" -force) -Reset
}

Попытка 2: ошибка "Невозможно проверить аргумент в параметре" Идентичность ". Аргумент имеет значение null."lime: 3 символа: 40

$UserFile = "c:\2019StudentsB115.csv"


foreach ($Account in $Resetpassword) {
    $Account.sAMAccountName
        Set-ADAccountPassword -Identity $Account.sAMAccountName -NewPassword (ConvertTo-SecureString "Qwerty19" -AsPlainText -force) -Reset
}

Я подумал, может быть, это был мой синтаксис с использованием Set-AdAccountPassword, но затем я попробовал это, и он работал нормально: Set-AdAccountPassword -Identity "math1-1" -NewPassword (ConvertTo-SecureString -AsPlainText "Qwerty10" -force)

Я передаюидентичность Math1-1 и пароль Qwerty10 в качестве нового пароля для этого командлета, и он работает, так почему я не могу передать это с помощью файла .csv?Любые советы или указатели будут оценены.У меня есть около 20 открытых вкладок от Google, и ничего не помогает.Я рассмотрел синтаксис для Get / set ADAddcount и ConvertTo-SecureString, но это не помогает мне понять, как назначать объекты из этого файла .csv.

Alex

Я попытался запустить:

foreach ($Account in $Resetpassword) {
        Set-ADAccountPassword  $Account -NewPassword (ConvertTo-SecureString -AsPlainText "Qwerty19" -force) -Reset
}

Результаты 1 из учетных записей:

Set-ADAccountPassword: Невозможно связать параметр 'Identity'.Не удалось преобразовать значение «@ {sAMAccountName = math5-3}» типа «System.Management.Automation.PSCustomObject» в тип «Microsoft.ActiveDirectory.Management.ADAccount».В строке: 2 символа: 30 + Set-ADAccountPassword <<<< $ Account -NewPassword (ConvertTo-SecureString -AsPlainText "Qwerty19" -force) -Re set + CategoryInfo: InvalidArgument: (:) [Set-ADAccountPassword], ParameterBindingException +FullyQualifiedErrorId: CannotConvertArgumentNoMessage, Microsoft.ActiveDirectory.Management.Commands.SetADAccoun tPassword </p>

1 Ответ

1 голос
/ 09 июля 2019

Пример 1 (CSV-файл содержит заголовок SamAccountName):

Предположим, что 2019StudentsB115.csv содержит следующее:

SamAccountName
Math9-9
Math1-1
User3

Должен работать следующий код:

$Accounts = Import-Csv "c:\2019StudentsB115.csv"
foreach ($Account in $Accounts) {
    Set-ADAccountPassword -Identity $Account.SamAccountName -NewPassword (ConvertTo-SecureString "Qwerty19" -AsPlainText -force) -Reset
}

Пример 2 (файл CSV не содержит заголовков):

Если ваш файл CSV не содержит заголовков и вы не хотите использовать заголовки, выполнитене использовать Import-Csv.Get-Content хорошо работает для текстового файла с отдельными значениями в каждой строке.Давайте предположим, что 2019StudentsB115.csv содержит следующее:

Math9-9
Math1-1
User3

Здесь CSV-файл не содержит заголовка.Теперь мы можем пропустить использование Import-Csv для упрощения.Код становится следующим, и обратите внимание, что свойство .SamAccountName больше не требуется.

$Accounts = Get-Content "c:\2019StudentsB115.csv"
foreach ($Account in $Accounts) {
    Set-ADAccountPassword -Identity $Account -NewPassword (ConvertTo-SecureString "Qwerty19" -AsPlainText -force) -Reset
}

Объяснение:

Если у вас есть файл, который вы читаете сImport-Csv, предполагается, что самая первая строка содержит заголовки, а не значения.Исключением является то, что если вы используете переключатель -Header, который автоматически создаст для вас заголовки и рассмотрит содержимое файла как все значения.

Когда используется Import-Csv, результирующий объект являетсямассив объектов, где каждый объект содержит свойство для каждого заголовка.В PowerShell, чтобы получить значение одного свойства, вам необходимо напрямую получить доступ к этому свойству.Одним из таких способов является использование синтаксиса object.property.Если вы получите доступ к свойству из массива объектов, он вернет значение этого свойства для каждого объекта в массиве.Вот где цикл foreach помогает, потому что он будет перебирать каждый объект в массиве.В моем примере $Accounts это массив объектов.$Account является текущим итерированным объектом, который имеет свойство SamAccountName из-за того, как создан файл CSV.Преимущество Import-Csv в том, что в вашем файле может быть много столбцов и заголовков, и вы можете игнорировать или выбирать те, которые полезны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...