Смена паролей всем локальным пользователям 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 безопасность паролей генерация генератор

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Пароли Программист 1С:Предприятие 8 Россия Абонемент ($m)

Как можно перенести пароли пользователей из одной базы в другую. Как установить нужный пароль списку пользователей.

1 стартмани

04.05.2026    338    2    DenShilyaev    0    

2

Пароли Программист 1С 8.3 1С:Бухгалтерия 3.0 1С:Управление нашей фирмой 3.0 Абонемент ($m)

Представляю обработку для изменения политики паролей для одного или нескольких пользователей с использованием встроенного в платформу функционала по управление политикой паролей из встроенного языка.

1 стартмани

09.04.2026    556    3    Vladislav39609    3    

4

Пароли Программист 1С 8.3 Абонемент ($m)

Получение списка пользователей без пароля. Управляемые и не управляемые формы. Любые конфигурации.

1 стартмани

11.03.2026    551    5    HIgor    0    

0

Пароли Перенос данных 1C Системный администратор Программист 1С 8.3 1С:ERP Управление предприятием 2 Абонемент ($m)

Данная обработка позволяет перенести пароли всех пользователей из одной информационной базы в другую. При администрировании нескольких баз данных 1С часто возникает задача переноса пользователей с сохранением их паролей. Поскольку 1С хранит пароли в зашифрованном виде, простое копирование записей пользователей невозможно. Представленная обработка решает эту проблему, предоставляя инструмент для экспорта и импорта паролей.

2 стартмани

04.02.2026    1189    9    InFlach    17    

8

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

Библиотека для создания многопоточного TCP-сервера, а так же TCP-клиента с поддержкой SSL/TLS шифрования для экосистемы OneScript. Удобный инструмент для построения распределенных систем, высоконагруженных сервисов, систем реального времени. С низким порогом вхождения и подробной документацией с примерами.

12.01.2026    1434    ahyahy    2    

10

Пароли Администрирование веб-серверов Системный администратор Программист Россия Абонемент ($m)

Для запуска базы, опубликованной на вебсервере через тонкий клиент (win/linux) с доменной авторизацией. Подходит для запуска тонкого клиента (база web публикация) с устройств не в домене, например для работы внешних пользователей.

1 стартмани

03.01.2026    3818    1    shooshpanius    0    

7

Пароли Системный администратор Программист 1С:Предприятие 8 Абонемент ($m)

Данная внешняя обработка для платформы 1С предназначена для анализа и проверки стойкости паролей пользователей информационной базы. Она выполняет поиск паролей методом перебора (brute-force) по их хранящемуся в системе хешу (1-2 минуты для выборки в 200 пользователей с установленными паролями). 

1 стартмани

27.11.2025    1487    11    InFlach    0    

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

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

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

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