Как произвести массовую смену паролей AD?

Добрый день уважаемые знатоки! Нужна помощь в решении такой тривиальной задачи:
Дано:

1) 110 учетных записей пользователей в AD (на сервере win2008R2)
2) Есть текстовый файл в котором построчно записаны все 110 пользователей в виде:
"CN=Петрова,OU=Users,OU=ORG.LOC,DC=org,DC=loc"
"CN=Сидорова,OU=Users,OU=ORG.LOC,DC=org,DC=loc"
"CN=Иванова,OU=Users,OU=ORG.LOC,DC=org,DC=loc"
"CN=Козлова,OU=Users,OU=ORG.LOC,DC=org,DC=loc"
и т.д. ровно 110 шт.
3) Текстовый файл, в котором прописаны построчно пароль из 9 символов:
gfhys32jf7
ahjds6382
dfk83j333
и т.д. ровно 110 шт.

Требуется:

Написать скрипт в powershell или просто батник, что бы он менял пароли пользователей (брал их из файла с паролями) и полученный результат выводил в некий третий файл в виде двух столбцов (1 столбез - учетка; 2 столбец -пароли)

Как менять пароли с помощью powershell (или cmd) я понимаю. Не получается считывать из файла данные и с помощью цикла их использовать в скрипте.

Set-ADAccountPassword -Identity NameUser -Reset -NewPassword (ConvertTo-SecureString -AsPlainText "password" -Force)

NameUser - имя пользователя из файла №1
"password" -пароль пользователя из файла №2
  • Вопрос задан
  • 3715 просмотров
Решения вопроса 2
@Krokozyabla Автор вопроса
!
Вот скипт, который в итоге навоял:
cls
Import-Module ActiveDirectory
$file1 = Get-Content C:\Script\ch_pwd\users_in_ou.txt #файл с логинами пользователе
$file2 = Get-Content C:\Script\ch_pwd\password_for_users.txt #файл с паролями пользователе  
$count = $file1.Length

write-host 'Всего прочитано и обработано записей',$count,':' # выводим на экран увидомление о количестве записей

for ($i = 0; $i -lt $count; $i++)
{ 
#$file1[$i] 
Set-ADAccountPassword -Identity $file1[$i] -Reset -NewPassword (ConvertTo-SecureString -AsPlainText $file2[$i] -Force)
$result = $file1[$i] +'  |   '+ $file2[$i]
Out-File -filepath C:\Script\ch_pwd\passwords_users.txt  -inputobject $result ASCII -width 250 -force -NoClobber -Append
}
Read-Host
Ответ написан
@yellowmew
Cloud infrastructure, monitoring engineer. SRE
get-help get-content -examples
$users = get-content file1.txt
считывает построчно ваш файл в переменную $users
каждую строку из файла можно адресовать по индексу в цикле for
get-help about_for -examples
for ($counter = 0; $counter -le $users.length;$counter +=1;) {write-host $users[$counter] }
Так как у вас файлы c одинаковым количеством строк то $passwords[$counter] даст соответствующий пароль внутри цикла, если считать файл паролей в переменную $passwords
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@BorisKorobkov
Web developer
На bash:
#!/bin/bash
file2="./source2.txt"
readarray file2_lines < $file2

file1="./source1.txt"
index=0
while read file1_line
do
	echo "$file1_line ${file2_lines[$index]}"
	index=$(($index+1))
done < $file1
Ответ написан
Комментировать
drsmoll
@drsmoll
Это Я.
Через FOR можно:
FOR /F "delims=; " %%i in (file.txt) do (
@echo %%i %%j
)
чтобы упростить, создайте файл со следующим содержанием:
CN=Петрова,OU=Users,OU=ORG.LOC,DC=org,DC=loc;gfhys32jf7
CN=Козлова,OU=Users,OU=ORG.LOC,DC=org,DC=loc;dfk83j333
Ответ написан
CityCat4
@CityCat4
Внимание! Изменился адрес почты!
Не знаю как это будет на powershell, а в VBS это может решаться например так: (strNoDeployFilename - строка, имя файла). Файл считали одним вызовом, распарсили вторым - там же не миллион строк - и работаем с массивом

' Create filesystem object
Set objFSO = CreateObject("Scripting.FileSystemObject")

' Open nodepolyed boxes list file
If objFSO.FileExists(strNoDeployFilename) Then
  Set objTextFile = objFSO.OpenTextFile(strNoDeployFilename, ForReading)
 Else
   WScript.Echo("Nodeployed boxes list file " & strNoDeployFilename & " does not exist")
   WScript.Quit
End If

strNoDeployLine = objTextFile.ReadAll 
objTextFile.Close

arrayNodeploy = Split(strNoDeployLine, vbNewLine, vbSplitAll, vbTextCompare)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы