Смена паролей всем локальным пользователям Windows с помощью OneScript

27.08.20

Разработка - OneScript

Скрипт, который меняет пароли всем локальным пользователям Windows и сохраняет их в файле. Есть функция генерации пароля, можно задать длину пароля.

Дано:

Терминальный сервер Windows без домена. Пользователи зарегистрированы на самом сервере.

Задача: сменить всем пароли.

 

Решение

Длина пароля составляет 14 символов.

1) Создаем файл ChangeUserPass.os

 

 


// Запускать от имени администратора.

Функция НовыйПароль(КоличествоСимволов = 14)
		
	ГЦ = Новый ГенераторСлучайныхЧисел;
	НижняяГраницаЧисел = 1;
	ВерхняяГраницаЧисел = 9;
	
	
	СтрЧисла = "0123456789";
	СтрБуквыЗаглавные = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	СтрБуквыСтрочные = "abcdefghijkmnopqrstuvwxyz";
	СтрСпецСимволы = "!@#$%^&*()-";
	
	СтрНабор = "Aa!Bb@Cc#Dd$Ee%^Ff&Gg*Hh(Ii)Jj-Kk1L2Mm3Nn4Oo5Pp6Qq7Rr8Ss9Tt2Uu4Vv5Ww6Xx7Yy8Zz9";
	
	Пароль = "";
	СлучЧисл = ГЦ.СлучайноеЧисло(1, СтрДлина(СтрЧисла));
	СлучайныйСимвол = Сред(СтрЧисла, СлучЧисл, 1);
	Пароль = Пароль + СлучайныйСимвол;
	
	СлучЧисл = ГЦ.СлучайноеЧисло(1, СтрДлина(СтрБуквыЗаглавные));
	СлучайныйСимвол = Сред(СтрБуквыЗаглавные, СлучЧисл, 1);
	Пароль = Пароль + СлучайныйСимвол;
	
	СлучЧисл = ГЦ.СлучайноеЧисло(1, СтрДлина(СтрБуквыСтрочные));
	СлучайныйСимвол = Сред(СтрБуквыСтрочные, СлучЧисл, 1);
	Пароль = Пароль + СлучайныйСимвол;
	
	СлучЧисл = ГЦ.СлучайноеЧисло(1, СтрДлина(СтрСпецСимволы));
	СлучайныйСимвол = Сред(СтрСпецСимволы, СлучЧисл, 1);
	Пароль = Пароль + СлучайныйСимвол;
	
	СлучЧисл = ГЦ.СлучайноеЧисло(1, СтрДлина(СтрНабор));
	СлучайныйСимвол = Сред(СтрНабор, СлучЧисл, 1);
	Пароль = Пароль + СлучайныйСимвол;
	
	СлучЧисл = ГЦ.СлучайноеЧисло(1, СтрДлина(СтрНабор));
	СлучайныйСимвол = Сред(СтрНабор, СлучЧисл, 1);
	Пароль = Пароль + СлучайныйСимвол;
	
	ДополнительноеКоличество = КоличествоСимволов - 6 - 1;
	Для ч = 0 По ДополнительноеКоличество Цикл
		СлучЧисл = ГЦ.СлучайноеЧисло(1, СтрДлина(СтрНабор));
		СлучайныйСимвол = Сред(СтрНабор, СлучЧисл, 1);
		Пароль = Пароль + СлучайныйСимвол;
	КонецЦикла;
	
	Возврат Пароль;
КонецФункции	

Функция ЗаменитьСимволы(т)
	Стр = "АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЬьЫыЪъЭэЮюЯя";
	// В обратную сторону, т.е. в первую очередь замена существующих русских букв.
	т = СтрЗаменить(т, "п", "я");
	т = СтрЗаменить(т, "о", "ю");
	т = СтрЗаменить(т, "н", "э");
	т = СтрЗаменить(т, "к", "ъ");
	т = СтрЗаменить(т, "л", "ы");
	т = СтрЗаменить(т, "м", "ь");
	т = СтрЗаменить(т, "й", "щ");
	т = СтрЗаменить(т, "и", "ш");
	т = СтрЗаменить(т, "з", "ч");
	т = СтрЗаменить(т, "ж", "ц");
	т = СтрЗаменить(т, "е", "х");
	т = СтрЗаменить(т, "д", "ф");
	т = СтрЗаменить(т, "г", "у");
	т = СтрЗаменить(т, "в", "т");
	т = СтрЗаменить(т, "б", "с");
	т = СтрЗаменить(т, "а", "р");
	// Теперь остальные.
	т = СтрЗаменить(т, "Ђ", "А");
	т = СтрЗаменить(т, " ", "а");
	т = СтрЗаменить(т, "Ѓ", "Б");
	т = СтрЗаменить(т, "Ў", "б");
т = СтрЗаменить(т, "‚", "В");
т = СтрЗаменить(т, "ў", "в");
т = СтрЗаменить(т, "ѓ", "Г");
т = СтрЗаменить(т, "Ј", "г");
т = СтрЗаменить(т, "„", "Д");
т = СтрЗаменить(т, "¤", "д");
т = СтрЗаменить(т, "…", "Е");
т = СтрЗаменить(т, "Ґ", "е");
//т = СтрЗаменить(т, "р", "Ё"); // Почему-то Ё закодировалась как р. Есть пересечение замены а->р.
//т = СтрЗаменить(т, "с", "ё"); // Почему-то ё закодировалась как с. Есть пересечение замены б->с.
т = СтрЗаменить(т, "†", "Ж");
т = СтрЗаменить(т, "¦", "ж");
т = СтрЗаменить(т, "‡", "З");
т = СтрЗаменить(т, "§", "з");
т = СтрЗаменить(т, "€", "И");
т = СтрЗаменить(т, "Ё", "и");
т = СтрЗаменить(т, "‰", "Й");
т = СтрЗаменить(т, "©", "й");
т = СтрЗаменить(т, "Љ", "К");
т = СтрЗаменить(т, "Є", "к");
т = СтрЗаменить(т, "‹", "Л");
т = СтрЗаменить(т, "«", "л");
т = СтрЗаменить(т, "Њ", "М");
т = СтрЗаменить(т, "¬", "м");
т = СтрЗаменить(т, "Ќ", "Н");
т = СтрЗаменить(т, "­", "н");
т = СтрЗаменить(т, "Ћ", "О");
т = СтрЗаменить(т, "®", "о");
т = СтрЗаменить(т, "Џ", "П");
т = СтрЗаменить(т, "Ї", "п");
т = СтрЗаменить(т, "ђ", "Р");
//т = СтрЗаменить(т, "а", "р"); // Почему-то р закодировалась как а.
т = СтрЗаменить(т, "‘", "С");
//т = СтрЗаменить(т, "б", "с"); // Почему-то с закодировалась как б.
т = СтрЗаменить(т, "’", "Т");
//т = СтрЗаменить(т, "в", "т"); // Почему-то т закодировалась как в.
т = СтрЗаменить(т, "“", "У");
//т = СтрЗаменить(т, "г", "у"); // Почему-то у закодировалась как г.
т = СтрЗаменить(т, "”", "Ф");
//т = СтрЗаменить(т, "д", "ф"); // Почему-то ф закодировалась как д.
т = СтрЗаменить(т, "•", "Х");
//т = СтрЗаменить(т, "е", "х"); // Почему-то х закодировалась как е.
т = СтрЗаменить(т, "–", "Ц");
//т = СтрЗаменить(т, "ж", "ц"); // Почему-то ц закодировалась как ж.
т = СтрЗаменить(т, "—", "Ч");
//т = СтрЗаменить(т, "з", "ч"); // Почему-то ч закодировалась как з.
т = СтрЗаменить(т, "", "Ш");
//т = СтрЗаменить(т, "и", "ш"); // Почему-то ш закодировалась как и.
т = СтрЗаменить(т, "™", "Щ");
//т = СтрЗаменить(т, "й", "щ"); // Почему-то щ закодировалась как Й.
т = СтрЗаменить(т, "њ", "Ь");
//т = СтрЗаменить(т, "м", "ь"); // Почему-то ь закодировалась как м.
т = СтрЗаменить(т, "›", "Ы");
//т = СтрЗаменить(т, "л", "ы"); // Почему-то ы закодировалась как л.
т = СтрЗаменить(т, "љ", "Ъ");
//т = СтрЗаменить(т, "к", "ъ"); // Почему-то ъ закодировалась как к.
т = СтрЗаменить(т, "ќ", "Э");
//т = СтрЗаменить(т, "н", "э"); // Почему-то э закодировалась как н.
т = СтрЗаменить(т, "ћ", "Ю");
//т = СтрЗаменить(т, "о", "ю"); // Почему-то ю закодировалась как о.
т = СтрЗаменить(т, "џ", "Я");
//т = СтрЗаменить(т, "п", "я"); // Почему-то я закодировалась как п.
Возврат т;
КонецФункции

Попытка
	КоличествоСимволов = 14;
	ТекДата = ТекущаяДата();
	сТекДата = Строка(ТекДата);
	сТекДата = СтрЗаменить(сТекДата, Символы.НПП, "");
	сТекДата = СтрЗаменить(сТекДата, ":", ".");
	сТекДата = СтрЗаменить(сТекДата, " ", "_");
	чДень = День(ТекДата);
	чГод = Год(ТекДата);
	чМес = Месяц(ТекДата);
	сГод = СтрЗаменить(Строка(чГод), Символы.НПП, "");
	сМес = ?(чМес > 9, Строка(чМес), "0"+Строка(чМес));
	сДень = ?(чДень > 9, Строка(чДень), "0"+Строка(чДень));
	КаталогЛогов = "C:\Temp\";
	ИмяЛога = КаталогЛогов + "LogUserPass_" + сТекДата + ".txt";
	ЛогУд = Новый ЗаписьТекста(ИмяЛога, КодировкаТекста.UTF8);
	ИмяФСписПольз = КаталогЛогов + "Users_" + сТекДата + ".txt";
	ИмяФСписПольз = КаталогЛогов + "Users.txt"; 
	тСообщ = "ИмяФСписПольз=" + ИмяФСписПольз;
	ЛогУд.ЗаписатьСтроку(тСообщ);
	Сообщить(ИмяФСписПольз);
	//кмдСписПольз = "CMD.exe /C chcp 65001 & net user>"+ИмяФСписПольз;
	кмдСписПольз = "CMD.exe /C net user>"+ИмяФСписПольз;
	
	тСообщ = "кмдСписПольз=" + кмдСписПольз;
	Сообщить(кмдСписПольз);
	ЛогУд.ЗаписатьСтроку(тСообщ);
	
	ШаблонСменыПароля = "CMD.exe /C net user [user] [pass]";
	
	КодВозврата = 0;
	ЗапуститьПриложение(кмдСписПольз, КаталогЛогов, Истина, КодВозврата);
	тСообщ = "КодВозврата=" + Строка(КодВозврата);
	Сообщить(тСообщ);
	ЛогУд.ЗаписатьСтроку(тСообщ);
	
	Ф = Новый Файл(ИмяФСписПольз);
	Если НЕ Ф.Существует() Тогда
		тСообщ = "Отсутствует файл: " + ИмяФСписПольз;
		Сообщить(тСообщ);
		ЛогУд.ЗаписатьСтроку(тСообщ);
		ЗавершитьРаботу(0);
		ЛогУд.Закрыть();
	КонецЕсли;	

	//ЧТ = Новый ЧтениеТекста(ИмяФСписПольз, "windows-1251");
	ЧТ = Новый ЧтениеТекста(ИмяФСписПольз, "cp866");
	ВесьТекст = ЧТ.Прочитать();
	ЧТ.Закрыть();
	Сообщить(ВесьТекст);
	МасПС = СтрРазделить(ВесьТекст, Символы.ПС);
	КолМасПС = МасПС.Количество();
	Сообщить("КолМасПС=" + Строка(КолМасПС));
	МассивЛогинов = Новый Массив;
		
	Для Каждого ТекСтр ИЗ МасПС Цикл
		Если ПустаяСтрока(ТекСтр) Тогда Продолжить; КонецЕсли;
		Если Найти(ТекСтр, "--") > 0 Тогда Продолжить; КонецЕсли;
		Если Найти(ТекСтр, "\\") > 0 Тогда Продолжить; КонецЕсли;
		
		//ТекСтр = ЗаменитьСимволы(ТекСтр);
		
		Если Найти(ВРЕГ(ТекСтр), ВРЕГ("Команда")) > 0 И Найти(ВРЕГ(ТекСтр), ВРЕГ("выполнена")) > 0 Тогда Продолжить; КонецЕсли;
		Если ПустаяСтрока(ТекСтр) Тогда			
			Продолжить;
		КонецЕсли;
		
		ЛогУд.ЗаписатьСтроку(ТекСтр);
		
		Мас1 = СтрРазделить(ТекСтр, " ");
		КолСтрМас = Мас1.Количество();
		//Сообщить("КолСтрМас=" + Строка(КолСтрМас));
		МаксИнд = КолСтрМас - 1;
		
		Логин = "";
		// + Для обработки логинов, содержащих пробел, например "Иванов Иван". Ограничение: только один пробел между словами логина.
		Для ч = 0 ПО МаксИнд Цикл
			ТекЭл = Мас1[ч]; 
			//Сообщить("ТекЭл=" + ТекЭл);
			Если ПустаяСтрока(ТекЭл) Тогда
				Если НЕ ПустаяСтрока(Логин) Тогда
					МассивЛогинов.Добавить(Логин);
					Логин = "";
				КонецЕсли;
				Продолжить;
			КонецЕсли;
			Логин = ?(ПустаяСтрока(Логин), ТекЭл, Логин + " " + ТекЭл);
		КонецЦикла;
		// - Для обработки логинов, содержащих пробел, например "Иванов Иван". Ограничение: только один пробел между словами логина.		
	КонецЦикла;
	
	н = -1;
	Для Каждого Логин ИЗ МассивЛогинов Цикл
		н = н + 1;
		тСообщ = "МассивЛогинов[" + Строка(н) + "]=" + Логин;
		Сообщить(тСообщ);
		Если ВРЕГ(Логин) = ВРЕГ("admin1") Тогда
			Продолжить; // Если сменить пароли абсолютно всем и не знать паролей, то не получится войти. Поэтому один-два админа сменят сами свои пароли.
		КонецЕсли;
			
		кмд = СтрЗаменить(ШаблонСменыПароля, "[user]", """" + Логин + """");
			
		Пароль = НовыйПароль(КоличествоСимволов);
		кмд = СтрЗаменить(кмд, "[pass]", """" + Пароль + """");
		ЛогУд.ЗаписатьСтроку(кмд);
		ЗапуститьПриложение(кмд, КаталогЛогов, Истина, КодВозврата);
		тСообщ = "КодВозврата=" + Строка(КодВозврата);
		Сообщить(тСообщ);
		ЛогУд.ЗаписатьСтроку(тСообщ);
	КонецЦикла;
	ЛогУд.Закрыть();
Исключение
	тСообщ = Строка(ТекущаяДата()) + ": " + ОписаниеОшибки();
	Сообщить(тСообщ);
	ЛогУд.ЗаписатьСтроку(тСообщ);
	ЛогУд.Закрыть();
КонецПопытки;

 

 

2) Создаем файл ChangeUserPass.bat

net user>C:\Temp\Users.txt
C:\utils\OneScript\bin\oscript.exe C:\utils\os\ChangeUserPass.os

3) Проверяем, что каталоги для создания файлов совпадают; в моем случае «C:\Temp\».

 

4) Запускаем ChangeUserPass.bat

Если не создались файлы, пробуем запустить от имени администратора.

 

5) В каталоге «C:\Temp\» должен быть файл «LogUserPass_*.txt» со списком логинов и паролей.

 

6) Все пароли сменены. Задача решена.

 

пароль смена пароля сменить Windows массовая все пароли скрипт автосмена автоматическая автоматически сбросить OneScript cmd bat безопасность паролей генерация генератор

См. также

Пароли Платформа 1С v8.3 1С:Бухгалтерия 3.0 Россия Абонемент ($m)

Создал простое расширение, которое проставит галку Запомнить пароль. Должно работать на всех версиях БСП, т.к. простое.

2 стартмани

19.11.2024    107    0    slavok123    0    

1

Пароли Системный администратор Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Расширение добавляет возможность настроить обновление пароля пользователем через заданный промежуток времени в днях (1-99 дней). Также добавлен контроль: новый пароль не должен совпадать с предыдущим.

1 стартмани

11.11.2024    194    1    KonorArgent    0    

1

OneScript Программист Бесплатно (free)

Отгремел Infostart Tech Event 2024, топовое событие в мире 1С-разработки, традиционно проходящее в Санкт-Петербурге. Ваш покорный слуга в этот раз отмечал там 10-летний юбилей проекта OneScript. Отмечание проводилось в форме игры-соревнования по забегу роботов в лабиринте. Участники пытались написать алгоритм движения робота на языке 1С и сделать это быстрее других. О том, как это было – под катом.

28.10.2024    1401    Evil Beaver    11    

24

OneScript Программист Бесплатно (free)

OneScript – это скриптовый движок для автоматизации всего и вся. О том, как OneScript помогает в разработке скриптов на языке 1С, пойдет речь в статье.

10.10.2024    2331    ardn    1    

6

Инструментарий разработчика OneScript Программист Руководитель проекта Бесплатно (free)

Все мы хотя бы раз работали с конструктором запросов. Результатом его работы является синтаксически верный запрос, оформленный по некоторому стандарту. Нравится - не нравится, а привыкаешь быстро, и на запрос, написанный руками, уже не хочется смотреть... А почему бы не попробовать сделать то же самое с исходным кодом 1С? Ну я и попробовал...

23.09.2024    609    0    stopa85    4    

5

Информационная безопасность Пароли Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Простой пример формирования одноразового секрета (пароля, сообщения и т.п. информации) через указания ключа.

16.07.2024    721    maksa2005    0    

1

Групповая разработка (Git, хранилище) OneScript Программист Платформа 1С v8.3 Бесплатно (free)

Скрипт для работы с SonarQube и локальным репозиторием Git.<br> Цель проекта – возможность выполнить быструю проверку качества кода перед тем, как помещать доработки в рабочее хранилище. В Sonar и Git выгружается не вся конфигурация, а только объекты из заданного списка.<br> https://github.com/vkrivov/go/

02.07.2024    3501    vkrivov@yandex.ru    8    

19

DevOps и автоматизация разработки OneScript Системный администратор Программист Стажер Бесплатно (free)

Рассмотрим создание самоформирующейся документации через комментарии и соглашения: как это сделать и зачем, с описанием полного цикла от исходников конфигурации до странички в интернете

17.06.2024    5203    bayselonarrend    5    

61
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Perfolenta 206 18.08.20 08:11 Сейчас в теме
ваша проблема в том, что вы хотите выполнить команду, которую может выполнить только интерпретатор cmd (имеется ввиду команда > ). Просто укажите его в командной строке и все заработает...
кмдСписПольз = "CMD.exe /C net user > "+ИмяФСписПольз;

ключ /С нужен для того, что бы после выполнения команды интерпретатор завершил работу...
2. info1i 236 20.08.20 13:01 Сейчас в теме
(1) Спасибо за подсказку!
Пока сервер недоступен; при появлении возможности, обязательно проверю и отредактирую скрипт в публикации.
Perfolenta; +1 Ответить
3. Perfolenta 206 20.08.20 23:51 Сейчас в теме
(2) кстати, если в именах пользователей есть русские буквы, то вы наверняка столкнетесь с проблемой кодировок... если хотите, проверьте и этот вариант...
5. info1i 236 31.08.20 16:16 Сейчас в теме
(3) Проверил на русских буквах - да, была проблема. Не придумал ничего умнее, как заменить закодированные символы обратно, в итоге получилось, но могут быть ошибки с буквами Ё, ё.
Perfolenta; +1 Ответить
6. Perfolenta 206 01.09.20 08:40 Сейчас в теме
(5) я пробовал ваш пример на своём языке Перфолента, поэтому не могу сказать будет ли так работать на OneScript, но у меня, что бы побороть кодировку, оказалось достаточно указать кодовую страницу cp866:

ЧТ = Новый ЧтениеТекста(ИмяФСписПольз,"cp866");

прикрепляю мой файл на Перфоленте...
Прикрепленные файлы:
СменаПаролей.pfl
7. info1i 236 02.09.20 09:54 Сейчас в теме
(6) Я просто не знал, как указать правильно кодировку; оказывается "cp866" - так прочиталось корректно.
Скрипт доработал с учетом кодировки. Но функцию замены символов на всякий случай оставил.
Perfolenta; +1 Ответить
4. info1i 236 31.08.20 16:11 Сейчас в теме
(1) Проверил; да, теперь с помощью CMD.exe команда выполняется. Спасибо! Скрипт поправил.
Perfolenta; +1 Ответить
Оставьте свое сообщение