iОнлайн
Запуск Powershell скриптов при помощи групповой политики на Windows XP, Windows 2003 и более старых
Как известно, после выхода на рынок операционных систем Windows Vista и Windows Server 2008, компания Microsoft стала активно внедрять новый инструмент автоматизации процессов администрирования, прищедщий на смену устаревшему BAT (CMD), язык Powershell. В последующем, все продукты компании начали получать поддержку этого языка. Стоит снять шляпу перед разработчиками, ибо они сделали язык с более-менее понятным синтаксисом (частично позаимствовав его из *nix-систем). С новыми продуктами все более менее понятно, но и о старых версиях ОС мелко-мягкие не забыли, и выпустили пакеты обновлений, позволяющие поддерживать powershell скрипты на более старых ОС. За это, конечно, спасибо, но остались некоторые вопросы.
Например, всем известно, что при помощи групповых политик Active Directory можно выполнять на клиентских машинах logon и logoff скрипты. Да, в новой версии настройки групповых политик (на серверах-контроллерах домена) появилась вкладка, которая позволяет добавить исполнение скрипта:
Но тут то Вас и постигнет разочарование. Этот элемент политики отработает только на ос не ниже Windows Vista. На более старых ОС он будет просто проигнорирован. И как же быть?
Все просто. Придется воспользоваться старым добрым батником. Имеющим следующий вид:
Полезные BAT/CMD скрипты
В этой теме выкладываем скрипты, которые часто используются Вами
или на Ваш взгляд могут иметь большое практическое значение.
Также приветствуются скрипты высокой степени сложности, полезные с точки зрения
изучения принципа их работы.
- При выкладывании скрипта постарайтесь тщательно описывать принцип его работы и по-больше комментировать строки Вашего кода.
- Код, состоящий из > 4 строк, помещайте под теги [SPOILER=»Развернуть код. «]Ваш код[/SPOILER] . Также можно сделать 2 варианта: 1. Чистый код. 2. С комментариями.
- Запрещаются любые обсуждения выложенных здесь работ;
- если в этом есть необходимость, создайте отдельную тему в которой опишите замечание или проблему при работе с данным скриптом, указав ссылку на сообщение из этой темы (правый клик по слову «Permalink» вверху каждого сообщения).
- Если Вы хотите внести исправление в выложенный Вами код — пишите мне в личку ссылку на Ваше старое сообщение и новый исправленный вариант. (полный вариант с тегами Вашего старого сообщения можно получить, нажав на него — кнопка «Цитата»).
- Допускается размещение обзора программ, помогающих редактировать/отлаживать код.
Схожая тема: BAT/CMD файлы
Смежная тема: Полезные VBS скрипты и программы по работе с ними
Ссылка на набор полезных скриптов (предыдущая шапка от bombus) BAT/CMD файлы
Архивация и резервное копирование
Создание CAB-архивов ссылка
Безопасность
Удаление последствий вируса (фейковые папки на флешке) ALINK
Стать владельцем папки/файла, получить полные права (пункт контекстного меню (Reg-файл) ALINK
Смена владельца и прав на папку и ее содержимое, в которой запущен батник (Full Access Read Only) ссылка
Дата, время
Конвертация даты/времени из/в UNIX-формат(в секундах после 1-янв-1970 00:00:00) ссылка
Интерфейс
Крутящаяся палка (имитация) ссылка
Вызов GUI диалогового окна выбора папки ссылка
Разноцветный вывод в консоли. ссылка Цветная роза. ссылка
Диалоговое меню выбора файла ссылка
Компиляция
Помощник компиляции исходных кодов С# (.cs) через консольный NET.FrameWork компилятор ссылка
Операционная система
Восстановление шрифтов после сбоя ссылка
Пищалка (сигнал встроенного динамика, подобие Beep) ссылка
Регистрация всех библиотек DLL и OCX ссылка
Проверка целостности системных файлов утилитой sfc /scannow с выводом лога и автоопределением месторасположения диска ссылка
Сеть
Подсчёт маски подсети на основании двух крайних значений диапазона. ALINK
Пакетное получение информации о IP-адресах и построение HTML-отчёта. ALINK
GetIP/GetMAC/Get default gateway ссылка
Процессы
Завершение процесса (с листингом и выбором через меню) ссылка
Многопроцессное создание пустых файлов (бенчмарк для винчестера) ссылка
Отслеживание зависшего процесса и его перезапуск с указанным приоритетом ссылка
Process Change Monitor (мониторинг и протоколирование изменений в списке запущенных процессов) ссылка
Текстовые операции, кодировка
Вывод текста без переноса на новую строку ALINK
Перекодировка CP OEM-866 WIN-1251 — 1) CMD 2) VBA 3) ASM (exe+src) ссылка
Помощь по всем командам вашей версии Windows / DOS ссылка
Транслитерация файлов, в именах которых есть кириллица (файловые операции) ссылка
Преобразование текстового файла в кодировку Unicode (файловые операции) ссылка
Перекодировщик Reversed Hex в символьную строку ссылка
Файловые операции, разделы
Взаимное копирование содержимого 2 папок друг в друга ALINK
Прогресс-бар копирования файлов ссылка
Циклическое копирование файлов по каталогам с ожиданием завершения их дозаписи в исходную папку. ссылка
Создание нуль-копии папки для выкладывания на форуме ссылка
Получение серийного номера всех съемных устройств и физических жестких дисков (не разделов). Получение имен разделов физических накопителей (кроме оптических). ссылка
Другое
Расчёт индекса массы тела и идеального веса ссылка
Batch (CMD/BAT) несколько заданий на CMD/BAT
1.Напишите bat файл на диске с ,который будет искать на всех дисках файлы с расширением.
CMD/BAT — Bat для запуска приложения при падении нагрузки ЦП другого процесса
Суть вопроса: есть батник запуска приложения @echo off start /d»C:\Program.
Как запустить bat файл командой cmd /k передав bat файлу дополнительные аргументы
Как передать bat файлу, запускаемому через cmd /k аргументы? Это был первый вопрос, а теперь вот.
Bat/cmd
Добро утро. Директор придумал просто одну вещь. Изложу ситуацию. У меня есть папка obchee_s_ras.
Критерий копирования при совпадении имен файлов: последняя дата модификации.
Использование:
Сохранить в файл Мое_Название_файла.CMD
Скопировать файл в папку № 1.
Перетянуть папку № 2 на этот сценарий.
Примечание: скрипт использует Robocopy.exe из пакета Windows Resource Kit (является родной для Windows 7)
Вложения
Dual_Synhro.zip (586 байт, 552 просмотров) |
Удаление последствий вируса (поддельные «фейковые» папки на флешке)
19.11.2012 — Критическое обновление (запускать скрипт «от имени Администратора» теперь безопасно).
Автор: Dragokas
Использование:
Скопировать в корень съемного диска (USB Flash Drive).
Запустить.
Показания к применению:
Ваша флешка побывала на компьютере с вирусом, скрывающим папки, а вместо них — теперь ярлыки.
Вы хотите, чтобы на флешке физически нельзя было создать autorun.inf, который дает команду на запуск паразитов.
Функционал v.1.5.:
1. Удаление файлов с расширением *.lnk (ярлыки), соответствующих именам папок.
1.1. Удаление других *.lnk с запросом подтверждения от пользователя.
2. Снятие атрибутов «скрытый», «системный» с папок в корне флешки.
3. Удаление файла автозапуска «autorun.inf».
4. Создание папки «autorun.inf» (контр-мера против дальнейшей возможности создавать файл autorun.inf)
Папка содержит в свою очередь 3 неудаляемые штатными способами подпапки, создаваемые разными алгоритмами.
(папка с 2 точками на конце, папка с именем системного устройства и папка с измененными ACL-правами доступа).
5. Удаление всех файлов с расширением *.exe в корне папки C:\Users\Пользователь\AppData\Roaming (%appdata%) — это безопасно.
6. Завершение процесса Host.exe. Поиск и удаление рекурсивно всех файлов Host.exe (все действия с подтверждением от пользователя).
7. Удаление модифицированных системных папок «recycled» и «System Volume Information» без подтверждения.
(удаление папки корзины Windows («recycler») на оперируемом томе происходит с подтверждением).
8. Удаление дополнительных обычно вирусных файлов (System, Game.cpl) в режиме подтверждения.
Тонкости:
Учитываются особенности работы с именами, где используются буквы украинского алфавита и др. спецсимволы.
Если удаление не происходит с первого раза предпринимается попытка получить права на объект и сменить владельца.
Если и это не получается сделать, производится попытка удалить папку/файл в обход ограничений API-функций Windows на имена.
Основные изменения в update 1.5. (от 16.11.2012)
Исправлены ошибки с кавычками и др. недочеты.
Скрипт спрашивает разрешения и ничего лишнего точно не удалит.
Более быстрая работа.
Добавлена визуализация и %-ый прогрессбар.
Как удалить созданную программой папку Autorun.inf
— Не скажу А вообще проще отформатировать флешку
Программа работает слишком долго:
— Вероятно много папок/файлов или за Вами очень внимательно следит антивирус
Зачем удалять программы в корне папки %appdata% ?
— Некоторые вирусы, скрывающие папки, хранят свое тело в папке %appdata%
Другие пользовательские или системные программы в корне этой папки никогда не хранятся.
В коде версии 1.5. использованы спецсимволы BackSpace, поэтому при прямом копировании кода Ваш батник работать не будет, как задумано.
(скачивайте через прикрепленный файл).
Add. Перевод на русский v.1.4.:
Скрипты для windows 2003
Репутация: 470
Постоялец
Группа: Пользователи
Сообщений: 1 799
С нами с: 14-March 07
Предлагаю выкладывать сюда скрипты для администрирования. Например вот мой для подключения сетевого диска
Репутация: 85
Активист
Группа: Пользователи
Сообщений: 430
С нами с: 2-October 07
Проверка изменений параметров в AD и отправка извещения на электронную почту или в список Sharepoint
/* ========================================================
‘
‘ Script Information: Отправка сообщения администратору
‘ при изменении данных в AD возможна отправка сообщения
‘ на электронную почту или создание задачи в MOSS 2007
‘
‘ Author: Коротенко Владимир SDC 2008 Voronezh
‘ Originally created: 15.04.2008 — 11:01:47
‘ Original path: untitled.vbs
‘ Description: Создание дампа схемы домена и сравнение
‘ с предыдущей копией для получения изменений и последующим
‘ оповещением
‘
‘ ========================================================
*/
// Секция настроек скрипта
var SmtpHost,SmtpPort,MailSubject,MailTo,MailFrom,TextBody;
var DumpCmdLine,WinDiff,DumpFile,DumpFileOld,WorkingFolder;
var DiffFile,DiffMessage;
var SpListGuid,SpHost,UseSp;
SmtpHost = «comp1»; // почтовый сервер для отправки сообщений
SmtpPort = 25; // порт почтового сервера
MailSubject = «Внесите изменения в организационную диаграмму»; // заголовок сообщения письма
MailTo = «vkoroten@ot.comch.ru»; // Адрес получателя
MailFrom = «vkoroten@ot.comch.ru»; // Адрес отправителя
DumpCmdLine = «c:\\windows\\system32\\ldifde.exe»; // командная строка для дампа данных их AD
WinDiff = «c:\\temp\\windiff.exe»; // Программа для сравнения 2
DumpFile = «schema.ldf»; // Имя 1 файла для сохранения
DumpFileOld = «schemaOld.ldf»; // Имя 2 файла для сравнения
WorkingFolder = «c:\\temp\\»; // рабочая папка для временных файлов
DiffFile = «diff.log»; // Служебный файл для результатов сравнения
DiffMessage = «1 files listed»; // строка которую мы ищем при от личии файлов
SpListGuid = «<3d9b5efb-c0c5-434c-b1da-61fea6e9d63b>«;
SpHost = «http://portal4»;
UseSp = true; // отправка сообщений в список Share Point
// Конец секции настроек
var file,wsh;
// создаем обьект для работы
if (file.FileExists ( WorkingFolder + DumpFileOld ))
file.DeleteFile( WorkingFolder + DumpFileOld);
if (file.FileExists(WorkingFolder + DumpFile) )
file.MoveFile (WorkingFolder + DumpFile, WorkingFolder + DumpFileOld)
wsh.Run( DumpCmdLine + » -f » + WorkingFolder + DumpFile,1,1);
TrimUnused (WorkingFolder + DumpFile);
if (file.FileExists ( WorkingFolder + DumpFileOld ))
CheckChanges( WorkingFolder + DumpFile,WorkingFolder + DumpFileOld);
// Проверка на различие 2 файлов
function CheckChanges (pathFrom ,pathTo)
<
var cmd;
// WinDiff.Exe output.ldf schemaOld.ldf -Sx logcmd
cmd = WinDiff + » » + pathFrom + » » + pathTo + » -Sx » + WorkingFolder + DiffFile;
wsh.Run (cmd,1,1);
objFile = file.OpenTextFile(WorkingFolder + DiffFile,1);
var buff = new String();
buff = objFile.ReadAll();
objFile.Close();
var arr = new Array();
arr = buff.split(«\r\n»);
if( arr[i].indexOf(DiffMessage) > — 1 )
<
var d = new Date();
TextBody = «Обнаружены изменения в схеме. Время сравнения: » + d.toString();
SendMessage();
>
>
>
// Убираем строки с часто изменяемыми аттрибутами
function TrimUnused (name )
<
var ForReading = 1;
var ForWriting = 2;
var objFSo,objFile;
objFSo = new ActiveXObject(«Scripting.FileSystemObject»);
objFile = objFSo.OpenTextFile(name, ForReading);
var strContents = new String();
strContents = objFile.ReadAll();
objFile.Close();
var arr = new Array();
arr = strContents.split(«\r\n»);
objFile = objFSo.OpenTextFile(name, ForWriting);
for(var i = 0; i » + message + » «;
var req = » «;
req += »
» + list + » «;
req += » » + batch + » «;
var r = hostName + «/_vti_bin/Lists.asmx?op=UpdateListItems»;
web.Open( «POST», r, False );
web.setRequestHeader( «Content-Type»,»text/xml; charset=utf-8″ );
web.setRequestHeader («SOAPAction»,»http://schemas.microsoft.com/sharepoint/soap/UpdateListItems»);
web.send( req);
//’WScript.Echo req
//’WScript.Echo Chr (13) & Chr (10)
//’WScript.Echo web.responseText
Скрипт для удаления лицензии терминалов на клиентах, каждые 30 дней:
‘ Удаляет при необходимости раздел реестра, в котором хранятся временные лицензии, если прошло 30 дней.
Option Explicit
Dim iCount, dDat, dReadDat, strPath, strRegKey ‘объявление переменных
Dim fso, fLogFile, wshSysEnv, wshShell ‘объявление объектов
dDat = date ‘получаем текущую дату
err.clear ‘yf всякий случай чистим стэк ошибок
on error resume next ‘После этого сообщения об ошибках не выводятся
‘Создаём объект Shell
Set wshShell = WScript.CreateObject(«WScript.Shell»)
‘Создаём объект Environment, в котором находятся искомая системная переменная
Set wshSysEnv = WshShell.Environment(«PROCESS»)
‘Вытаскиваем системную переменную (путь к виндовской папке) и помещаем ее в строковую переменную для дальнейшего использования
strPath = wshSysEnv(«WINDIR»)
‘Создаём объект доступа к файловой системе и объект доступа к нужному файлу на чтение
Set fso = CreateObject(«Scripting.FileSystemObject»)
set fLogFile = fso.OpenTextFile(strPath & «\LiDelDat.alx», 1, false)
‘Основное условие удаления или неудаления ветви реестра
If err.number<>0 then
‘Выполнение процедуры удаления ветви реестра
Call DelLicense
‘Занесение последней даты удаления лицензии в файл журнала, затирая имеющуюся в нём запись
Call WriteToLog
Else
‘Считываем из файла и сравниваем дату последнего удаления лицензии с текущей датой
dReadDat = CDate(fLogFile.ReadLine())
‘Должно быть (dDat — dReadDat)
If (dDat — dReadDat) > 29 Then
‘Выполнение процедуры удаления ветви реестра
Call DelLicense
‘Занесение последней даты удаления лицензии в файл журнала, затирая имеющуюся в нём запись
Call WriteToLog
End If
End If
‘Уничтожаем все ненужные более объекты
Set WshShell = Nothing
Set wshSysEnv = Nothing
Set fso = Nothing
for iCount = 0 to 9
strRegKey = «HKLM\SOFTWARE\Microsoft\MSLicensing\Store\LICENSE00» & iCount & «\»
WshShell.RegDelete (strRegKey)
If err.number <> 0 then
err.clear
End If
next
‘Удаляем подключи основного раздела
WshShell.RegDelete («HKLM\SOFTWARE\Microsoft\MSLicensing\Store\»)
if err.number <> 0 then err.clear
WshShell.RegDelete («HKLM\SOFTWARE\Microsoft\MSLicensing\HardwareID\»)
if err.number <> 0 then err.clear
‘Удаляем основной раздел
WshShell.RegDelete («HKLM\SOFTWARE\Microsoft\MSLicensing\»)
if err.number <> 0 then err.clear
‘Процедура записи даты последнего удаления лицензии в файл
Sub WriteToLog()
err.clear
‘Создаём объект доступа к нужному файлу на запись с затиранием предыдущих записей
set fLogFile = fso.OpenTextFile(strPath & «\LiDelDat.alx», 2, true)
‘Записываем в файл дату очистки реестра
fLogFile.Write(Date)
set fLogFile = nothing ‘уничтожаем объект
End Sub
Скрипт по борьбе с mail.ru-агентом
Const DeleteReadOnly = TRUE
Set WshShell = WScript.CreateObject («Wscript.Shell»)
Set WshSysEnv = WshShell.Environment («Process»)
Set objFSO = CreateObject(«Scripting.FileSystemObject»)
agentFile = WshSysEnv («userprofile») + «\Application Data\Mail.Ru\Agent\magent.exe»
If objFSO.FileExists(agentFile) Then
if err.number = 0 then
Set objEmail = CreateObject(«CDO.Message»)
objEmail.From = «killer@kontora.ru»
objEmail.To = «admin@kontora.ru»
objEmail.Subject = «Mail.ru-агент»
objEmail.Textbody = «Уважаемые господа системные администраторы, уведомляю Вас о том что уничтожен вражеский mail.ru агент из » + WshSysEnv («userprofile»)
objEmail.Configuration.Fields.Item _
(«http://schemas.microsoft.com/cdo/configuration/sendusing») = 2
objEmail.Configuration.Fields.Item _
(«http://schemas.microsoft.com/cdo/configuration/smtpserver») = _
«ip почтового сервера»
objEmail.Configuration.Fields.Item _
(«http://schemas.microsoft.com/cdo/configuration/smtpserverport») = 25
objEmail.Configuration.Fields.Update
objEmail.Send
P.S. Еще нужно?
Репутация: 470
Постоялец
Группа: Пользователи
Сообщений: 1 799
С нами с: 14-March 07
Репутация: 4911
Злой модер
Группа: Пользователи
Сообщений: 1 832
С нами с: 11-March 06
Репутация: 132
Старожил
Группа: Пользователи
Сообщений: 2 035
С нами с: 27-February 07
Наверно проще всего получать когда пользователь подключился — в батнике или логон скрипте:
echo. | date >> user_date.log
Репутация: 85
Активист
Группа: Пользователи
Сообщений: 430
С нами с: 2-October 07
strComputer = «.»
Set WshShell = WScript.CreateObject(«WScript.Shell»)
strCommand = «C:\WINDOWS\system32\ntbackup.exe backup @C:\cmd\Back-UP-Drive-C.bks /a /v:no /r:no /rs:no /hc:off /m normal /j Back-UP-Drive-C /l:s /f D:\Back-Up\Backup-drive-c.bkf»
WshShell.Run strcommand, 1, true
Set objWMIService = GetObject(«winmgmts:\\» & strComputer & «\root\cimv2»)
Set colItems = objWMIService.ExecQuery(«Select * from Win32_LocalTime»)
For Each objItem in colItems
strCommand = «C:\Arch\7z.exe a D:\Back-Up\Backup-dc-srv-01-DayOf-Week-«&objItem.DayOfWeek&».7z D:\Back-Up\*.bkf -t7z -m0=BCJ2 -m1=LZMA:d23 -m2=LZMA:d19 -m3=LZMA:d10M -mb0:1 -mb0s1:2 -mb0s2:3″
Next
WshShell.Run strcommand, 1, true
strCommand = «ftp -s:C:\CMD\ctp-command.txt»
WshShell.Run strcommand, 1, true
Репутация: 51
Активист
Группа: Пользователи
Сообщений: 368
С нами с: 6-February 07
Dim Mlogins(9000),MAdspath(9000),MFullName(9000)
Dim objFileSystem, objInputFileFromKardy,strData
Set objFSO = CreateObject(«Scripting.FileSystemObject»)
Const OPEN_FILE_FOR_READING = 1
‘Указываем домен
Const strDomainName=» »
‘Указываем OU в AD, внутри которой мы будем искать
Const strStartOU=»Domain Users»
strDomainDN=»DC=»&Replace(strDomainName,».»,»,DC=»)
‘———————Получение данных———————
Set objConnection = CreateObject(«ADODB.Connection»)
objConnection.Open «Provider=ADsDSOObject;»
Set objCommand = CreateObject(«ADODB.Command»)
objCommand.ActiveConnection = objConnection
objCommand.CommandText = » ;(&(objectCategory=person)(objectClass=user));ADsPath;subtree»
objCommand.Properties(«Page Size»)=4000
Set objRecordSet = objCommand.Execute
‘——Индексирование ———
index=0
While Not objRecordset.EOF
strADsPath = objRecordset.Fields(«ADsPath»)
Set objUser = GetObject(strADsPath)
MFullName(index)=objUser.DisplayName&» »
Mlogins(index)=objUser.sAMAccountName
MAdspath(index)=strADsPath
index=index+1
objRecordset.MoveNext
‘Путь в файлу в котором хранится список ФИО людей учётные записи которых нужно открыть/закрыть
strFileOfFiried = «d:\file_of_firied.txt»
Set objFileSystem = CreateObject(«Scripting.fileSystemObject»)
Set objInputFileFromKardy = objFileSystem.OpenTextFile(strFileOfFiried,OPEN_FILE_FOR_READING)
‘Загоняем содержимое файла в массив
inputDataFromFiried = Split(objInputFileFromKardy.ReadAll, vbNewline)
‘Обнуляем списки результатов
UserDisables=»»
UserUpdated=»»
UserNoFound=»»
UserDuplicated=»»
ii=0
For each strFULL In inputDataFromFiried
if Len(strFULL)>5 then
‘обнуляем счётчик найденых соответсвий
e=0
‘1е поле:выделяем из строчки ФИО пользователя
strFIO=Left(strFULL,InStr(strFULL,»;»)-1)
‘Разбиваем по частям ФИО
Familia=Left(strFIO,(Instr(strFIO,» «)-1))
N=Trim(mid(strFIO,Instr(strFIO,» «)))
Imya=Left(N,(Instr(N,» «)-1))
Otchestvo=Trim(mid(N,Instr(N,» «)))
‘Собираем по частям ФИО
strFIO=Familia&» «&Imya&» «&Otchestvo
index=maxindex
While index>1
‘Разбиваем по частям ФИО в AD
AdFamilia=»»
AdImya=»»
AdOtchestvo=»»
AdFamilia=Left(MFullName(index),(Instr(MFullName(index),» «)-1))
if Len(Trim(mid(MFullName(index),Instr(MFullName(index),» «))))>1 then
AdN=Trim(mid(MFullName(index),Instr(MFullName(index),» «)))
if Len(Left(AdN,(Instr(AdN,» «))))>1 then
AdImya=Left(AdN,(Instr(AdN,» «)-1))
if Len(Trim(mid(AdN,Instr(AdN,» «))))>1 then
AdOtchestvo=Trim(mid(AdN,Instr(AdN,» «)))
end if
end if
‘Собираем по частям ФИО
AdstrFIO=AdFamilia&» «&AdImya&» «&AdOtchestvo
AdstrFIO1=AdImya&» «&AdOtchestvo&» «&AdFamilia
AdstrFIO2=AdImya&» «&AdFamilia&» «&AdOtchestvo
‘Wscript.Echo AdstrFIO
if (StrFIO=AdstrFIO) or (StrFIO=AdstrFIO1) or (StrFIO=AdstrFIO2) then
e=e+1
Mindex=index
end if
index=index-1
Wend
if e=1 then
‘блокируем логин в AD
LockUser(Mlogins(Mindex))
UserDisables=UserDisables& «User: » &strFIO&» is disabled» & vbCrLf
end if
‘Не блокируем/открываем, т.к. у нас найдено несколько одинаковых ФИО
if e>1 then
UserNoFound=UserNoFound &»User: » &strFIO&» is found more than 1 times» & vbCrLf
end if
‘Не блокируем/открываем, т.к. пользователь не найден
if e=0 then
UserDuplicated=UserDuplicated&»User: » &strFIO&» is not found » & vbCrLf
end if
‘если есть какой-то результат, то
if (len(UserDisables)+len(UserNoFound)+len(UserDuplicated) > 10) then
‘ начинаем отправлять почту
Set objNetwork = CreateObject(«Wscript.Network»)
objComputerName = objNetwork.ComputerName
objUserName = objNetwork.UserName
Set objMessage = CreateObject(«CDO.Message»)
objMessage.From = » »
objMessage.To = » »
objMessage.Subject = «Тема письма»
‘Ставим кодировочку
objMessage.bodypart.charset= «koi8-r»
objMessage.TextBody = UserDisables&vbCrLf&UserNoFound&vbCrLf&UserDuplicated
objMessage.Configuration.Fields.Item _
(«http://schemas.microsoft.com/cdo/configuration/sendusing») = 2
‘Name or IP of Remote SMTP Server
objMessage.Configuration.Fields.Item _
(«http://schemas.microsoft.com/cdo/configuration/smtpserver») = » «
‘Server port (typically 25)
objMessage.Configuration.Fields.Item _
(«http://schemas.microsoft.com/cdo/configuration/smtpserverport») = 25
objMessage.Configuration.Fields.Update
‘==End remote SMTP server configuration section==
objInputFileFromKardy.Close
Set objFileSystem = Nothing
Sub LockUser(strText)
‘ в этой строчке значение TRUE — дисейблит пользователя, FALSE — открывает пользователя
strDisableAccount = TRUE
strUserLogin = strText
set objUser = GetObject(«WinNT:// /»& strUserLogin &»,user»)
if strDisableAccount = TRUE then
objUser.AccountDisabled = strDisableAccount
objUser.Description = «Account is Disabled because of firing » & «at «&» «&Date()
objUser.SetInfo
end if
if strDisableAccount = FALSE then
objUser.AccountDisabled = strDisableAccount
objUser.Description = «Account is Opened by script » & «at «&» «&Date()
objUser.SetInfo
end if
Репутация: 329
Активист
Группа: Пользователи
Сообщений: 229
С нами с: 12-May 07
Нужен скрипт для получения инфо по объектам АД — Пользователь (поиск по всему каталогу или конкретным OU ), у которых «Срок действия учетной записи: Истекает дд/мм/гггг»
Сообщение отредактировал Alex_GR — May 8 2008, 16:35
Репутация: 329
Активист
Группа: Пользователи
Сообщений: 229
С нами с: 12-May 07
Как этими скриптами воспользоваться ?
Если не трудно напиши. спс.
Репутация: 85
Активист
Группа: Пользователи
Сообщений: 430
С нами с: 2-October 07
//*****************************************************************************
// JScript 2004 Shs
//Этот скрипт предназначен для копирования файла в пользовательские перемещаемые профили
//(Добавляем ярлычок в меню пользователя)
//******************************************************************************
//
//
//*****************************************************************************
// Рекурсивная функция перехода по всем подкаталогам, начиная с заданого (PolFldr)
// и копирования заданного файла (ScriptName) по заданым папкам (FldrName)
//******************************************************************************
function LoopSubFolders (PolFldr, DeepCount)
<
var SubFolders, // Коллекция подкатологов системных политик
fsoPolFldr, //объект для доступа к папке
CurFldr; //текущая папка
DeepCount++;
//WScript.Echo(DeepCount);
if (DeepCount «+chr(10)+»Дата сбора: » & invdate & »
« temp=temp+»Имя компьютера»+» | «+objitem.name+ « | |
« temp=temp+»Оперативная память»+» | «+cstr(round(objitem.totalphysicalmemory/constmb))+ » MB | |
« temp=temp+»Модель компьютера»+» | «+objitem.model+ « | |
« temp=temp+»Материнская плата»+» | «+objitem.SMBIOSBIOSVersion+» | |
« temp=temp+»BIOS»+» | » + objitem.caption+» | «+chr(10)+» |
« temp=temp+»Процессор»+cstr(s)+» | «+objitem.name+» Частота «+cstr(objitem.CurrentClockSpeed)+chr(10)+» | |
« if objitem.size > 0 then ‘ = nill then sizegb=cstr(round(objitem.size/constgb,2)) else sizegb=cstr(0) end if temp=temp+»Жесткий диск «+cstr(i)+» | «+objitem.model + » » + sizegb + » GB | |
« temp=temp+»Видеоконтролер»+» | «+objitem.caption+chr(10)+» | |
« temp=temp+»Сетевой адаптер»+» | «+objitem.name+chr(10)+» | |
« temp=temp+»Звуковая карта»+» | «+objitem.caption+chr(10)+» | |
« temp=temp+»SCSI Адаптер»+» | «+objitem.manufacturer+» «+objitem.caption+chr(10)+» | |
« temp=temp+»Принтер «+cstr(d)+» | «+objitem.name+chr(10)+» |
«
‘Запись файла
Dim fso, tf
Set fso = CreateObject(«Scripting.FileSystemObject»)
Set tf = fso.CreateTextFile(«\\servak\comp\»&compname&».htm», True)
tf.Write (temp)
tf.Close
next
Репутация: 470
Постоялец
Группа: Пользователи
Сообщений: 1 799
С нами с: 14-March 07
Открываеш блокнот, копируеш туда код и сохраняеш документ с расширением .vbs.
Далее если сеть без доменов копируеш этот файлик в автозагрузку каждому ПК. Если сеть с доменом, то создаеш груповую политику (в AD), где в параметрах автозагрузки вставляеш данный файл. Далее при подключении или перезагрузке учетной записи будет выполняться скрипт
Репутация: 329
Активист
Группа: Пользователи
Сообщений: 229
С нами с: 12-May 07
ок.
есть два скрипта — разницы не вижу
1.Determining When an Account Expires
Returns the expiration date for a user account.
On Error Resume Next
Set objUser = GetObject _
(«LDAP://cn=myerken,ou=management,dc=fabrikam,dc=com»)
If err.number = -2147467259 Or _
dtmAccountExpiration = «1/1/1970» Then
WScript.echo «No account expiration specified»
Else
WScript.echo «Account expiration:» & _
objUser.AccountExpirationDate
End If
2. Determining When a User Account Expires
Reports the date that the MyerKen Active Directory user account expires.
On Error Resume Next
Set objUser = GetObject _
(«LDAP://cn=MyerKen,ou=Management,dc=NA,dc=fabrikam,dc=com»)
dtmAccountExpiration = objUser.AccountExpirationDate
If Err.Number = -2147467259 Or dtmAccountExpiration = «1/1/1970» Then
WScript.Echo «No account expiration specified»
Else
WScript.Echo «Account expiration: » & objUser.AccountExpirationDate
End If
я их кинул в файлик VBS, подставил свои параметры и . не увидел результата.
просьба протестировать и отписаться.
проблема была в том, что онсмотрит по конкретной учетке, а весь OU не смотрит.
кто может скрипт подправить . Всем спс.
Сообщение отредактировал Alex_GR — May 8 2008, 16:40
Репутация: 470
Постоялец
Группа: Пользователи
Сообщений: 1 799
С нами с: 14-March 07
Репутация: 85
Активист
Группа: Пользователи
Сообщений: 430
С нами с: 2-October 07
Cкрипт рекурсивно устанавливает всем пользователям домена атрибут «User must change password on next logon»
Dim strMyOU
Dim strMyDomain
Dim objOU, objUser
Dim strContainer, strLastUser
strMyOU = «argo»
strMyDomain = «DC=argo,DC=com»
sub recurs(ou)
strContainer = «OU=»+ou+»,» + strMyDomain
set objOU = GetObject(«LDAP://» & strContainer )
For each objUser in objOU
strLastUser = objUser.Get («name»)
If objUser.Class=»organizationalUnit» Then
recurs(strLastUser+», OU=»+ou)
Elseif objUser.Class=»user» Then
objUser.Put «pwdLastSet», 0
objUser.SetInfo
end if
next
end Sub
P.S. Ддля корректной работы необходимо в переменной strMyDomain определить имя домена с точки зрения LDAP — т.е. все точки заменить на «DC=». Таким образом, домен argo.com превращается в DC=argo,DC=com в переменную strMyOU необходимо поместить наименование Organization Unit а, юзеров которого необходимо подвергнуть процедуре изменения пароля.
Репутация: 51
Активист
Группа: Пользователи
Сообщений: 368
С нами с: 6-February 07
я их кинул в файлик VBS, подставил свои параметры и . не увидел результата.
просьба протестировать и отписаться.
проблема была в том, что онсмотрит по конкретной учетке, а весь OU не смотрит.
кто может скрипт подправить . Всем спс.
‘Указываем домен
Const strDomainName=» »
‘Указываем OU в AD, внутри которой мы будем искать
Const strStartOU=»Domain Users»
strDomainDN=»DC=»&Replace(strDomainName,».»,»,DC=»)
‘———————Получение данных———————
Set objConnection = CreateObject(«ADODB.Connection»)
objConnection.Open «Provider=ADsDSOObject;»
Set objCommand = CreateObject(«ADODB.Command»)
objCommand.ActiveConnection = objConnection
objCommand.CommandText = » ;(&(objectCategory=person)(objectClass=user));ADsPath;subtree»
objCommand.Properties(«Page Size»)=9000
Set objRecordSet = objCommand.Execute
‘——Индексирование ———
While Not objRecordset.EOF
strADsPath = objRecordset.Fields(«ADsPath»)
Set objUser = GetObject(strADsPath)
dtmAccountExpiration = objUser.AccountExpirationDate
If err.number = -2147467259 Or _
dtmAccountExpiration = «1/1/1970» Then
WScript.echo «No account expiration specified»
Else
WScript.echo «Account expiration:» & _
objUser.AccountExpirationDate
Репутация: 51
Активист
Группа: Пользователи
Сообщений: 368
С нами с: 6-February 07
Репутация: 85
Активист
Группа: Пользователи
Сообщений: 430
С нами с: 2-October 07
Получение SID (а) компьютера из AD
On Error Resume Next
Dim Tmp, x, b, Sid
Set objSysInfo = CreateObject(«ADSystemInfo»)
strComputerDN = objSysInfo.ComputerName
Set objCmp = GetObject(«LDAP://» & strComputerDN)
Sid = objCmp.objectSID
gSID = «S-1-5-«&Convert(16,19)&»-«&Convert(12,15)&»-«&Convert(8,11)&»-«&Convert(4,7)&»-«&Convert(0,3)
Set objGroup = Nothing
function Convert(u,l)
Tmp = «»
For x = UBound(Sid)-u to UBound(Sid)-l Step -1
b = AscB(MidB(SID, x + 1))
Tmp = Tmp & Hex(b \ 16) & Hex(b And 15)
Next
Convert = Clng(«&H» & Tmp)
end function
wscript.echo(gSID)
Поиск аккаунтов в ActiveDirectory с просроченными паролями
on Error resume next
DC=getObject(«LDAP://RootDSE»).get(«defaultNamingContext»)
dom=getObject(«LDAP://» & DC).get(«Name»)
pwAge=getObject(«WinNT://» & dom).get(«MaxPasswordAge»)/86400
set objConnection=createObject(«ADODB.Connection»)
objConnection.open «Provider=ADsDSOObject;»
‘ — Command for searching computer accounts
‘cmd=» ;(objectClass=computer);distinguishedName,samAccountName;subtree»
‘ — Command for searching user accounts
cmd=» ;(objectCategory=person);distinguishedName,samAccountName;subtree»
if col.recordCount>0 then
col.moveFirst
while not col.EOF
dn=col.fields(0).value
acc=col.fields(1).value
set obj=getObject(«LDAP://» & dn)
accCtrl=obj.get(«userAccountControl»)
if (accCtrl and &h10000)=0 then
pwChg=obj.PasswordLastChanged
if (Err.Number<>0) then
E=CStr(Err.Number) & » » & Err.Description
‘ WScript.echo acc & space(16-len(acc)) & » — Error : » & E
Err.clear
else
if (now-pwChg)>pwAge then
WScript.echo acc & space(16-len(acc)) & » — Expired : » & (pwChg+pwAge)
else
‘ WScript.echo acc & space(16-len(acc)) & » — Expire on : » & (pwChg+pwAge)
end if
end if
else
‘ WScript.echo acc & space(16-len(acc)) & » — Never Expire»
end if
col.moveNext
wend
end If
Если NetBIOS имя домена отличается от DNS до первой точки, то руками вместо строки
dom=getObject(«LDAP://» & DC).get(«Name») присвоить нужное значение
Репутация: 329
Активист
Группа: Пользователи
Сообщений: 229
С нами с: 12-May 07
‘Указываем домен
Const strDomainName=» »
‘Указываем OU в AD, внутри которой мы будем искать
Const strStartOU=»Domain Users»
strDomainDN=»DC=»&Replace(strDomainName,».»,»,DC=»)
‘———————Получение данных———————
Set objConnection = CreateObject(«ADODB.Connection»)
objConnection.Open «Provider=ADsDSOObject;»
Set objCommand = CreateObject(«ADODB.Command»)
objCommand.ActiveConnection = objConnection
objCommand.CommandText = » ;(&(objectCategory=person)(objectClass=user));ADsPath;subtree»
objCommand.Properties(«Page Size»)=9000
Set objRecordSet = objCommand.Execute
‘——Индексирование ———
While Not objRecordset.EOF
strADsPath = objRecordset.Fields(«ADsPath»)
Set objUser = GetObject(strADsPath)
dtmAccountExpiration = objUser.AccountExpirationDate
If err.number = -2147467259 Or _
dtmAccountExpiration = «1/1/1970» Then
WScript.echo «No account expiration specified»
Else
WScript.echo «Account expiration:» & _
objUser.AccountExpirationDate
End If
Wend
objConnection.Close
очень удачный «например».
только есть два «НО» — скрипт не показывает ФОИ и не совсем получилось с OU (у меня путь длиннее чем один юнит).и вопрос: поиск внутри OU только пользователей? а если внутри есть ещё OU ? — смотрит все
с этим я разобрался.
Как сделать, чтобы скрипт смотрел только те учетки у которых в будущем закончится скор действия ??ну и вывод в файл.
спс огромное
Сообщение отредактировал Alex_GR — May 12 2008, 13:58
Репутация: 85
Активист
Группа: Пользователи
Сообщений: 430
С нами с: 2-October 07
Скрипт опрашивает компьютеры домена на предмет того, какой пользователь залогинен в данный момент на каждом компьютере
On Error Resume Next
Const ADS_SCOPE_SUBTREE = 2
Set objRoot = GetObject(«LDAP://RootDSE»)
strDomainName = objRoot.Get(«DefaultNamingContext»)
Set objRoot = Nothing
strComputer = «»
Dim fso
Dim file
Set fso = CreateObject(«Scripting.FileSystemObject»)
Set file = fso.OpenTextFile («logged_user_list.txt», 2, True)
Set objShell = CreateObject(«WScript.Shell»)
Set objConnection = CreateObject(«ADODB.Connection»)
Set objCommand = CreateObject(«ADODB.Command»)
objConnection.Provider = «ADsDSOObject»
objConnection.Open «Active Directory Provider»
Set objCommand.ActiveConnection = objConnection
objCommand.CommandText = «Select Name, Location from ‘LDAP://» & strDomainName & «‘» _
& «Where objectClass =’computer'»
objCommand.Properties(«Page Size») = 1000
objCommand.Properties(«Searchscope») = ADS_SCOPE_SUBTREE
Set objRecordSet = objCommand.Execute
Wscript.Echo «Processing information. This might take several minutes.»
Do Until objRecordSet.EOF
strComputer = objRecordSet.Fields(«Name»).Value
‘ Проверяем доступность компьютера с помощью команды PING
‘ и анализа выходного потока
Set objScriptExec = objShell.Exec(«%comspec% /c ping.exe -n 1 » & strComputer)
strPingResults = LCase(objScriptExec.StdOut.ReadAll)
‘ Если компьютер отвечает, подключаемся к его WMI
If InStr(strPingResults, «ttl=») Then
Set objWMIService = GetObject(«winmgmts:» _
& «
Set colComputer = objWMIService.ExecQuery _
(«Select * from Win32_ComputerSystem»)
‘ Выводим список залогиненных пользователей в файл и на экран
For Each objComputer in colComputer
Wscript.Echo «Logged-on » &strComputer & » user: » & objComputer.UserName
file.WriteLine(«Logged-on » &strComputer & » user: » & objComputer.UserName)
Next
objRecordSet.MoveNext
‘ Если компьютер не отвечает — выводим сообщение и перемещаемся к следующему
Else
WScript.Echo(strComputer & «: Не отвечает. «)
objRecordSet.MoveNext
End If
Loop
Этот скрипт просматривает системный журнал Безопасность и если обнаружит в нём запись об изменении настроек браузера, то уведомит об этом.
Репутация: 51
Активист
Группа: Пользователи
Сообщений: 368
С нами с: 6-February 07
Например печатеть свойство DisplayName, в скрпите ниже оно будет.
Насчёт OU в скрипте есть строчка запроса к LDAP:
objCommand.CommandText = » ;(&(objectCategory=person)(objectClass=user));ADsPath;subtree»
из чего видно что в переменную strStartOU ты записываешь нужный тебе путь кроме первой «OU=»
В этом же скрипте за дату отвечает свойство:
dtmAccountExpiration сравниваешь его с нужной тебе датой и получаешь только тебу у кого дата истечения такая, как тебе надо.
Вот «доделаный например»:)
‘Указываем домен
Const strDomainName=» »
‘Указываем OU в AD, внутри которой мы будем искать
Const strStartOU=»Domain Users»
strDomainDN=»DC=»&Replace(strDomainName,».»,»,DC=»)