Скрипт для обнаружения файла в локальной сети. Скрипт для создания пользователя в AD с помощью powershell

06.03.2019
2 июля 2012 в 23:09 Как быстро «забросить» 100500 новых юзеров в Active Directory (поднятую на MS Windows Server 2003) или Скрипт для добавления учетных записей пользователей в Active Directory
  • Системное программирование

Так уж случилось, что я выбрал профессию системного администратора. И занимаюсь этим порою неблагодарным делом уже без малого около 6 лет.
Однажды, пару лет назад, передо мною встал вопрос, позже переросший в задачу, заключающийся в том, как же относительно быстро завести новые учётные записи пользователей в AD под MS Windows Server 2003?

Я думаю что всем известен способ добавления пользователя в домен, так сказать, «ручками». То есть, для добавления новых учётных записей пользователей AD приходится делать примерно следующие вещи: открыть оснастку «Пользователи и компьютеры» вышеназванной ОС, открыть соответствующую OU (Organization Unite), инициировать любым из известных способов создание пользователя, и затем в открывшемся окне создавать пользователей одного за другим. Согласитесь, это достаточно долго и муторно, особенно если необходимых учётных записей пользователей не 10, а скажем - 300, 500 и более. Особенно это станет рутинным делом тогда, когда нужно будет заполнить не только поля «логин» и «пароль», но и, расположенные во всевозможных вкладках, поля «Фамилия», «Имя Отчество», «Должность», «Отдел», «Организация» и т.д. Конечно, Вы скажете что методы «копипасты» и «слепого набора» еще никто не отменял, но вы попробуйте, и ощутите на каком по счету пользователе вы устанете, а если не устанете, то посчитайте потом количество совершенных ошибок при забивке данных.
В общем, поняв что нужно что-то делать с этим и так как время у меня было ограничено, я обратился к интернет ресурсам с целью поиска скрипта, который должен был существовать и решить эту проблему, как подсказывало мое чутье. Увы, я практически разочаровался в том, что увидел. В интернете было полно всевозможных скриптов для автоматизации различных задач в среде AD, но то, что мне было нужно - отсутствовало напрочь. Пришлось обратиться к англоязычным ресурсам, на одном из которых (увы, сайт-ссылку на момент написания статьи я уже утерял, есть мысли где искать, и если найду, то опубликую) был некий скрипт-«рыба» на VBS в очень «сыром» виде, что выяснилось при попытке его применить на тестовой системе ни к чему не приведшей - он просто, априори, не работал, ввиду наличия в нем множества недоработок и банальных ошибок, как выяснилось мною позже. Пришлось исправлять, дописывать код и стать, вдобавок ко всему, немного программистом на языке VBS:)
За сим, позвольте представить на суд уважаемой публики скрипт для добавления учетных записей пользователей в AD в предварительно созданные OU (1-го уровня). Если возникнет вопрос почему и OU не создаются автоматически, то отвечу заранее, что не нашел как это осуществить, да и контроль так жестче за производимыми изменениями в AD - все же приходится не в песочнице играться, а вносить ощутимые изменения в мощную и функционирующую в реальном времени систему, так называемую «Active Directory».

Важное замечание!
Заранее нужно создать файл, содержащий через разделитель ";" необходимые параметры:
Логин; Пароль; Имя Отчество; Фамилия; Должность; Отдел; Организация;
Обязательно наличие замыкающего разделителя ";" в каждой строке, например:
sirin-bird1; пароль1; Имя Отчество1; Фамилия1; Должность1; Отдел1; Организация1;
sirin-bird2; пароль2; Имя Отчество2; Фамилия2; Должность2; Отдел2; Организация2;
sirin-bird4; пароль3; Имя2 Отчество3; Фамилия3; Должность3; Отдел3; Организация3;
sirin-bird3; пароль4; Имя Отчество4; Фамилия4; Должность4; Отдел4; Организация4;
sirin-bird5; пароль5; Имя2 Отчество5; Фамилия5; Должность5; Отдел5; Организация5;
… … … … … … …
Создание такого файла можно поручить и неквалифицированному персоналу, умеющему обращаться с элементарным текстовым редактором. А потом всего лишь проверить правильность набора текста и расстановки разделителей, как и поступил Ваш покорный слуга.

Еще одно важное замечание!
Параметр «Организация» является OU для соответствующего пользователя и не создается этим скриптом, поэтому чтобы все сработало - предварительно создайте соответствующие OU в корне домена (возле папки OU «Users»). Это объясняется тем, что у меня в домене было несколько организаций-клиентов со своими пользователями-сотрудниками, отсюда и такое разделение.

Итак, сам скрипт:
Set objArgs = WScript.Arguments
if objArgs.Count = 0 then
WScript.Echo «Добавляет пользователей в домен.»
WScript.Echo «add_to_ad.vbs [имя файла]»
WScript.Echo " [имя файла] - файл со списком пользователей"
WScript.Echo " формат файла: Логин; Пароль; Имя-Отчество; Фамилия; Должность; Отдел; Организация;"
WScript.Quit
end if
path = objArgs(0)

Set fso = CreateObject(«Scripting.FileSystemObject»)
Set objFile = fso.OpenTextFile(path, 1)
Do Until objFile.AtEndOfStream
str = objFile.ReadLine
for i = 1 to Len(str) step 1
strCh = Mid (str, i, 1)
if strCh = ";" then
select case Z
case 0
UserName = strRez " *** Логин
case 1
UserPassword = strRez " *** Пароль
case 2
FirstName = strRez " *** Имя-Отчество
case 3
LastName = strRez " *** Фамилия
case 4
Title = strRez " *** Должность
case 5
Department = strRez " *** Отдел
case 6
Company = strRez " *** Организация
"case 7
"Manager = strRez" *** Руководитель
"case 8
"OfficeRoom = strRez " *** Комната
end select
strRez = ""
strCh = ""
Z = Z + 1
else
strRez = strRez + strCh
end if
next
strRez = ""
strCh = ""
Z = 0

Set objRoot = GetObject(«LDAP://RootDSE»)
Set objADSystemInfo = CreateObject(«ADSystemInfo»)
DomainDNSName = objADSystemInfo.DomainDNSName
DomainDN = objRoot.Get(«DefaultNamingContext»)
ContainerDN = «ou=» & Company & "," & DomainDN

PName = UserName & "@" & DomainDNSName ""@snb.local"

"!!! ВАЖНО!!!***Указываем ЗАРАНЕЕ СОЗДАННУЮ OU в которую кидаются новые пользователи *******

Set objOU = GetObject(«LDAP://» & ContainerDN)

"*************************** Создаем учетку пользователя домена ***********************
Set objUser = objOU.Create(«User», «cn=» + UserName)
" **** Login *****
objUser.Put «sAMAccountName», UserName
objUser.SetInfo

" ****** пароль *******
Set objUser = GetObject («LDAP://cn=» + UserName + "," + ContainerDN)
objUser.SetPassword UserPassword

" ******* UPN **********
objUser.Put «userPrincipalName», pName

"****** выключение аккаунта *******
objUser.AccountDisabled = TRUE

" ******** Имя *********
objUser.Put «givenName», FirstName

" ***** Фамилия *********
objUser.Put «sn», LastName

" ***** Выводимое имя ******
objUser.Put «displayName», LastName & " " & FirstName

" Инициалы
objUser.Put «initials», left(FirstName,1) & "." "& left(LastName,1)

" ***** Должность ******
objUser.Put «title», Title

" ***** Отдел ******
objUser.Put «department», Department

" Организация
objUser.Put «Company», Company

" Руководитель
"objUser.Put«manager», Manager

" комната
"objUser.Put «physicalDeliveryOfficeName», OfficeRoom

" ***** Уст. Требовать смену пароля при следующем входе в систему ***
objUser.Put «pwdLastSet», CLng(0)

ObjUser.SetInfo

" WScript.Echo «Пользователь - » + UserName + " добавлен в AD"

Loop
WScript.Echo «Пользователи добавлены в AD»
objFile.Close

дополнительный код для вставки в скрипт:

" Домашний каталог
"objUser.Put «HomeDirectory», strHomeDirPath

" почтовый ящик
"objUser.Put «mailNickname», strName

" еще немного примеров:
"ObjUser.Put «Description», «Year 2»
"objUser.Put «physicalDeliveryOfficeName», sOfficeName
"objUser.Put «ProfilePath», sScPath
"sHDrive objUser.Put «HomeDrive», «Z»
"objUser.Put «TerminalServicesProfilePath», sTermProf
"objUser.Put «TerminalServicesHomeDirectory», sTermHDir

Код из текстового редактора сохранить нужно с расширением.vbs
Запуск скрипта осуществляется с передачей параметров из файла.
Например: script.vbs users.txt
, где
script.vbs - сам скрипт
users.txt - файл с входными данными.

Выполнение скрипта занимает секунды с мгновенным результатом на выходе.
Как видно из кода, если раскомментить еще пару строк и внести дополнения в файл с входными параметрами, то можно «на автомате» внести еще и Руководителя и Номер комнаты. Скрипт можно развивать неограниченно. Например, добавить возможность внесения таким же образом такого поля как «Телефон».
В качестве текстового редактора под Windows могу посоветовать свободный для использования и весьма функциональный Notepad++.
Одна из полезных ссылок, где есть скрипты на VBS.

Помните ВАТ-файлы DOS? Это было прекрасное средство автоматизации повторяющихся задач. Windows, увы, не предложила эквивалентной замены, а средства сторонних разработчиков не прижились по различным причинам. Но положение, похоже, может исправиться. Windows Scripting Host (WSH) - новый, независимый от языка скрипт-хост для Win9x и NT, позволяет строить аналоги ВАТ-файлов на Visual Basic Scripting Edition, JScript и других скриптовых языках, например, Active Perl или Python.

Здесь мы обсудим некоторые преимущества Windows Scripting Host.

Преимущества Windows Scripting Host

Раньше единственным поддерживаемым Windows скриптовым языком был командный язык DOS. Но его возможности довольно бедны по сравнению с VBScript и JScript. Хотя командный язык DOS по прежнему поддерживается, современные ActiveX-скрипты позволяют решать более сложные задачи.

Cкрипт может принимать решения на основе использования полноценных операторов If/Else. Сценарий может выполнять один набор команд, если данное условие истинно, или другой набор, если условие ложно. Кроме того, JScript и VBScript хороши при выполнении математических операций, включая общие тригонометрические функции.

Другое свойство Windows Scripting Host заключается в том, что скрипты могут исполняться вне браузера. Достаточно кликнуть по файлу с текстом скрипта или ввести его название в командной строке,чтобы запустить его на исполнение. Windows Scripting Host не требователен к памяти и прекрасно годится для автоматизации Windows.

Хост и скриптовые машины

Как ни хороши скриптовые языки, многого с ними не сотворишь. Они неспособны повлиять на что-либо за пределами родного скрипта. Эти языки не имеют прямых инструкций, позволяющих читать или записывать файлы на диске, выводить информацию в командную строку, изменять записи в Реестре Windows и так далее.

Чтобы справиться с такими задачами, можно воспользоваться дополнительными COM-объектами. Ряд таких объектов входит в поставку WSH, а один из них, WScript, даже уже имеет созданный экземпляр, и им можно пользоваться непосредственно, без предварительного создания. Остальные создаются с помощью синтаксиса, соответствующего конкретному языку или функции WScript.CreateObject.

Объекты WSH

В поставку Windows Scripting Host входят 4 объекта: Wscript, WshShell, WshNetwork, и FileSystemObject.

Каждый объект, естественно, имеет набор собственных методов и свойств.

Объект Wscript позволяет скриптам "познать самих себя". Вдобавок этот объект позволяет скриптам запускать приложения и управлять ими. Основные свойства и методы этого объекта перечислены в таблице 1.

Свойство Описание Метод Описание
Arguments Возвращает указатель на список аргументов командной строки
FullName Возвращает имя исполняемого файла хоста и полный путь к нему (например, C:\Windows\wscript.exe)
Name Выводит замечательную надпись Windows Scripting Host
Path Определяет каталог и путь, содержащие wscript.exe или cscript.exe
ScriptFullName Возвращает полный путь и имя исполняемого в данный момент скрипта
ScriptName То же, что и ScriptFullName, но без пути
Version Возвращает версию установленного Windows Scripting Host
CreateObject Создает объект по его ProgID
ConnectObject Позволяет подключиться к событиям объекта. В качестве параметра принимает объект, к которому надо подключиться и префикс соответствующих событиям процедур, реализованных в скрипте
DisconnectObject Отключает от объекта, подключенного предыдущим методом
Echo Выводит текстовую строку (в cscript - в StdOut, в Wscript - в виде диалогового окна.
GetObject Позволяет получить указатель на объект из файла или объекта, указанного в параметре strProgID.
Quit Завершает скрипт
Sleep Переводит скрипт в неактивное состояние на время, указанное в миллисекундах

Таблица 1. Методы и свойства объекта WScript

Объект WshShell позволяет скриптам устанавливать и конфигурировать другие приложения. Он также дает возможность общаться с пользователем, изменять Реестр и находить папки. Некоторые его свойства и методы перечислены в таблице 2.

Свойство Описание Метод Описание
Environment

Возвращает объект, который позволяет получить значения переменных среды, например

Set WSHShell = CreateObject("WScript.Shell") Set WshSysEnv = WshShell.Environment("Process") WScript.Echo WshSysEnv("windir")

SpecialFolders

Возвращает полный путь к специальным папкам типа меню Пуск.

Вот список доступных папок: AllUsersDesktop, AllUsersStartMenu, AllUsersPrograms, AllUsersStartup, Desktop, Favorites, Fonts, MyDocuments, NetHood, PrintHood, Programs, Recent, SendTo, StartMenu, Startup, Templates.

Run Запускает приложение. strCommand - исполняемая команда, параметр intWindowStyle позволяет управлять положением и поведением окон, а bWaitOnReturn позволяет указать объекту WshShell, надо ли ожидать окончания выполнения запущенного приложения.
Popup Ещё один способ вывести текст в окне
CreateShortcut Создает ярлыки файлов или URL
RegRead Возвращает значение ключа или записи реестра по его имени
RegWrite Создает новые ключ или запись Реестра или записывает новое значение существующих.
RegDelete Удаляет ключ или запись реестра
LogEvent Позволяет записать сообщение в event log Windows NT или W2K или файл WSH.log в случае Windows
ExpandEnvironmentStrings Позволяет раскрыть строку, содержащую переменные среды
SendKeys Позволяет эмулировать клавиатурный ввод

Таблица 2. Свойства и методы объекта WshShell

Объект WshNetwork используется при создании скриптов, модифицирующих конфигурацию сети. Это включает задачи типа подключения к сети, инсталляцию принтеров, назначение буквенных обозначений сетевым дискам и так далее. Основные свойства и методы WshNetwork перечислены в таблице 3.

Свойства Описание Метод Описание
ComputerName Возвращает имя компьютера
UserDomain Возвращает имя домена, в котором зарегистрирован пользователь
UserName Возвращает догадаетесь что!
MapNetworkDrive Присваивает назначенную пользователем букву сетевому диску
EnumNetworkDrives Возвращает список подключенных сетевых дисков
RemoveNetworkDrive Отключает сетевой диск
AddWindowsPrinterConnection Позволяет установить новый принтер в Windows, то есть указать путь к принтеру и инициировать установку драйверов.
AddPrinterConnection Подключает сетевой принтер
RemovePrinterConnection Отключает сетевой принтер
SetDefaultPrinter Задает принтер по умолчанию
EnumPrinterConnections Возвращает список подключенных принтеров

Таблица 3. Свойства и методы объекта WshNetwork

Последний объект, FileSystemObject, нужен для дисковых операций. Это включает чтение, запись, удаление файлов и создание каталогов.

FileSystemObject имеет методы BuildPath, CopyFile, CopyFolder, CreateFolder, CreateTextFile, DeleteFile, DeleteFolder, DriveExists, FileExists, FolderExists, GetAbsolutePathName, GetBaseName, GetDrive, GetDriveName, GetExtensionName, GetFile, GetFileName, GetFolder, GetParentFolderName, GetSpecialFolder, GetTempName, MoveFile, MoveFolder, OpenTextFile. Их названия в отдельном объяснении не нуждаются. Его единственное свойство Drives возвращает список дисков, доступных на данной машине, включая сетевые.

Что вам нужно для начала

Первое, что надо сделать - убедиться, что Windows Scripting Host у вас есть. В состав W2K он входит изначально. Если вы используете Windows 98 или Internet Information Server 4.0, или если вы устанавливали Option Pack для Windows NT 4 и для Windows 95, он у вас точно есть. В случае Windows 95 все усложняется, и Windows Scripting Host придется скачивать с сайта Microsoft (msdn.microsoft. com/ scripting). Напишите в командной строке wscript. Если появилось диалоговое окно с надписью, отличной от "File not found", все в порядке.

Microsoft не поставляет визуального редактора скриптов WSH. Но Notepad вполне годится.

Создание и запуск скриптов

По сравнению с различными программистскими изысками писать скрипты для Windows Scripting Host относительно просто. В Notepad вы пишете свой скрипт с использованием упомянутых объектов. Потом сохраняете файл с расширением.vbs для VBScript или.js для JScript.

Запуск скриптов - тоже несложная задача. Есть несколько способов. Самый простой - командная строка DOS и аналогичная версия Windows Scripting Host, CSCRIPT.ЕXE. Эта версия позволяет контролировать исполнение скрипта с помощью параметров командной строки.

Параметры хоста включают или отключают различные опции Windows Scripting Host и всегда предваряются двумя слэшами (//). Имя скрипта - это всегда имя файла, а параметры скрипта - параметры, передаваемые скрипту. Эти параметры всегда предваряются одним слэшем (/). Таблица 4 содержит некоторые параметры CSCRIPT.EXE.

Таблица 4. Параметры командной строки CSCRIPT.EXE

Если вы не желаете видеть окошек с кнопкой ОК, используйте cscript.exe, а для вывода сообщений пользуйтесь методом WScript.Echo.

Для запуска скриптов с помощью wscript.exe имеются три пути.

Один из них - просто дважды щелкнуть по файлу или иконке. Другой - выбрать Выполнить... из меню Пуск и написать полное имя файла в текстовом поле Открыть. Наконец, можно запустить сам WSCRIPT.EXE из того же Выполнить..., добавив к нему имя скрипта и любой из возможных параметров.

Пример скрипта

Попробуем написать какой-нибудь скрипт на VBScript. Конкретный пример, приведенный в Листинге 1 , предоставлен Microsoft и может быть получен (как и несколько других) с их WWW-сайта: .

Листинг 1

" Этот пример показывает, как использовать объект WSHShell " для создания ярлыка на Рабочем столе. L_Welcome_MsgBox_Message_Text = _ "Этот скрипт создаст ярлык для Notepad на Рабочем столе." L_Welcome_MsgBox_Title_Text = "Пример Windows Scripting Host " Call Welcome() " *************************************************************** * " * Методы, связанные с ярлыками. " *DimWSHShell Set WSHShell = WScript.CreateObject("WScript.Shell") Dim MyShortcut, MyDesktop, DesktopPath " Читаем путь к Рабочему столу DesktopPath = WSHShell.SpecialFolders("Desktop") " Создаем ярлык на Рабочем столе Set MyShortcut = WSHShell.CreateShortcut(DesktopPath & _ "\Shortcut to notepad.lnk") " Задаем свойства объекта-ярлыка и сохраняем их MyShortcut.TargetPath = WSHShell.ExpandEnvironmentStrings _ ("%windir%\notepad.exe") MyShortcut.WorkingDirectory = WSHShell.ExpandEnvironmentStrings _ ("%windir%") MyShortcut.WindowStyle = 4 MyShortcut.IconLocation = WSHShell.ExpandEnvironmentStrings _ ("%windir%\notepad.exe, 0") MyShortcut.Save WScript.Echo "Теперь на Рабочем столе есть ярлык для Notepad." " **************************************************************** " * " * Добро пожаловать " * Sub Welcome() Dim intDoIt intDoIt = MsgBox(L_Welcome_MsgBox_Message_Text, _ vbOKCancel + vbInformation, _ L_Welcome_MsgBox_Title_Text) If intDoIt = vbCancel Then ;WScript.Quit End If End Sub

Этот скрипт создает на рабочем столе ярлык для Notepad. Замечу, что сейчас в наши задачи не входит обучение пользователя программированию на VB или Java. Тем не менее, этот пример даст вам представление о том, что Windows Scripting Host может делать при наличии некоторых базовых навыков программирования.

Теперь пора перейти к более существенным применениям WSH. Наверное, больше всего WSH пригодится администраторам, осатаневшим от регулярного повторения одних и тех же действий. Администраторы Windows NT не располагали возможностями UNIX-администраторов, использовавших скрипты испокон веков. С появлением WSH ситуация изменилась, тем более, что WSH позволяет воспользоваться внешними по отношению к скриптовым языкам технологиям, таким, как Windows Management Instrumentation (WMI) и Active Directory Services Interface (ADSI).

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

В этих примерах предполагается, что вы используете W2K, для других платформ, вам, вероятно, придется установить WMI и ADSI.

Использование WSH и WMI для создания Logon-скриптов

Как вы знаете, такие скрипты подразумевают запуск в момент старта. В Листинге 2 приведен загрузочный скрипт, который определяет тип входящего в систему пользователя и выполняет задачи, основываясь на этой информации.

Листинг 2

on error resume next set wshNetwork = WScript.CreateObject("WScript.Network") Set wshShell = WScript.CreateObject("WScript.Shell") do while wshNetwork.username = "" WScript.Sleep 250 loop user = wshNetwork.username domain = wshNetwork.userdomain Wscript.echo "Logging on " & ucase(domain) & "\" & user & "..." " используя ADSI получаем список групп, в которые входит пользователь adspath = "WinNT://" & domain & "/" & user set adsobj = GetObject(adspath) " Вызов других подпрограмм based on the Windows NT group of the user for each prop in adsobj.groups select case prop.name case "Administrators" call Adminslogon case "YourNewGroup" call YourNewGrouplogon end select next

Первое, скрипт создает некоторые общие объекты которые вам придется использовать, например, объекты WScript.Network и WScript.Shell. Дальше он использует эти объекты для определения имени пользователя и доменной информации. Наконец, используя ADSI скрипт возвращает информацию содержащую группу пользователя. Эта информация используется для определения подходящей подпрограммы, вызываемой для каждой из пользовательских групп. Это выполняет оператор Select Case.

Загрузочный скрипт для пользователей создаваемой нами группы Windows NT (под именем YourNewGroup) использует сетевые возможности WSH. Он проверяет, используется ли буква Z. Если она свободна, диском Z назначается \\yourserver\NETLOGON используя формат \\server\share.

Чтобы объяснить, как работает загрузочный скрипт, некоторые подпрограммы и функции вынесены в текст статьи. Можете просто вернуть их на место в блок в Листинге 2 .

Sub Domainlogon if CheckNetworkMapping("z:", "\\yourserver\NETLOGON") = false then MapNetwork "z:", "\\yourserver\NETLOGON " end if end sub

Функция CheckNetworkMapping перечисляет различные буквы дисков чтобы определить, используется ли данная буква (см. Листинг 3 ). Она возвращает true или false на основании доступности данной буквы. В случае true вызывается подпрограмма MapNetwork для выполнения отображения. Эта подпрограмма использует метод MapNetworkDrive объекта wshNetwork для присвоения сетевому ресурсу соответствующей буквы. Более полную информацию о объекте wshNetwork можно получить из таблицы 3.

Листинг 3

" проверяем наличие сетевого диска, в случае отсутствия добавляем " Эта функция проверяет наличие сетевого диска Function CheckNetworkMapping(DriveLetter) Dim Drive WScript.Echo "Проверяем наличие подключенного сетевого диска " & DriveLetter CheckNetworkMapping = False For Each Drive In wshNetwork.EnumNetworkDrives If LCase(Drive) = LCase(DriveLetter) Then CheckNetworkMapping = True Exit For End If Next If CheckNetworkMapping Then WScript.Echo "Сетевой диск найден" Else WScript.Echo " Сетевой диск не найден" End If End Function " Эта подпрограмма ассоциирует букву с сетевым каталогом sub MapNetwork(driveletter, netshare) on error resume next err.clear WScript.Echo "Подключаем сетевой диск." wshNetwork.MapNetworkDrive driveletter, netshare, true if err 0 then "Подключение не удалось WScript.Echo "не могу ассоциировать " & driveletter & " с " & netshare else WScript.Echo "ОК..." end if end sub

Администраторы могут захотеть получить более детальную информацию, чем описание сетевых ресурсов и пользовательской среды. Им может потребоваться информация о компьютере, например, переменные среды, конфигурация компьютера, аппаратные устройства и так далее. Используя только объектную модель WSH следующий код покажет вам как вывести некую информацию о среде и реестре вашего компьютера.

Sub Adminslogon Wscript.Echo _ "Эта процедура возвращает значения основных переменных среды данного компьютера." ReturnENV Wscript.Echo regProxy Wscript.Echo "Для работы следующих двух строк требуется ввести сервер, имя пользователя и пароль Wscript.Echo "IP-адреса этого компьютера: " & GetIPAddress _ ("yourserver ", "administrator", "p-word") Wscript.Echo "Общее количество RAM на этой машине: " & GetRAM _ ("yourserver ", "administrator", "p-word") end sub

Этот скрипт приведен чисто для примера - легкомысленно было бы хранить пароль администратора в открытом виде.

Что же еще можно сделать с помощью объектов, поставляемых вместе с WSH? Например, вы можете получить некую информацию о вашем компьютере. Это можно сделать с помощью метод ReturnENV. Сперва в этом методе потребуется подключить wshProcEnv к рабочей среде. Перед этим нужно создать объект wshShell (см. скрипт ниже). Как только вы подключились к окружению процесса, вы можете вернуть данные наподобие NUMBER_OF_PROCESSORS или PATH конфигурации данного компьютера. Здесь несколько примеров того, что вы можете извлечь из окружения процесса.

Sub ReturnENV() set wshShell = Wscript.CreateObject("WScript.Shell") set wshProcEnv = wshShell.environment("process") WScript.Echo ("NUMBER_OF_PROCESSORS: " & wshProcEnv _ ("NUMBER_OF_PROCESSORS")) WScript.Echo WScript.Echo ("PROCESSOR_IDENTIFIER: " & wshProcEnv _ ("PROCESSOR_IDENTIFIER")) WScript.Echo WScript.Echo ("OS: " & wshProcEnv ("OS")) WScript.Echo WScript.Echo ("PATH: " & wshProcEnv ("PATH")) WScript.Echo WScript.Echo ("WINDIR: " & wshProcEnv ("WINDIR")) WScript.Echo end sub

Заметьте, что этот скрипт полностью работоспособен только в среде NT (или W2K). В WindowsК9x будут доступны только PATH и WINDIR.

Вы, несомненно, знаете, что неумелыми, а тем более умелыми действиями в реестре можно быстро и бесповоротно угробить любую ОС от Microsoft. Для автоматизации этого процесса WSH предоставляет простой способ управления реестром. Методами RegRead, RegWrite и RegDelete вы можете сделать все, что заблагорассудится. Все, что требуется - указать верный ключ для чтения, записи или удаления.

Попробуем для примера настроить proxy-сервер. Получить текущую информацию, хранящуюся в реестре по адресу HKCU\Software\Microsoft\ Windows\CurrentVersion\Internet Settings\ProxyServer можно с помощью метода RegRead. Затем, используя RegWrite, перепишем это значение собственным, именем какого-то вашего proxy-сервера, MYPROXY:80. Наконец, убедимся, что записали верную информацию, для чего снова считаем значение с помощью RegRead.

Sub regProxy prefix = "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\" WScript.Echo "Старые установки Proxy-сервера: " & wshShell.RegRead(prefix & _ "ProxyServer") wshShell.regWrite prefix & "ProxyServer", "MYPROXY:80" WScript.Echo " Новые установки Proxy-сервера: " & wshShell.RegRead(prefix & _ "ProxyServer") end sub

С помощью WMI вы можете собрать массу интересных сведений. Функция GetIPAddress использует WMI для определения IP-адреса машины. Здесь я не буду вдаваться в детали WMI, но, в основном, команда GetObject берет объект управления WMI. Этот объект содержит метод ExecQuery, который берет текстовый аргумент, описывающий IP-адрес и возвращает набор всех IP-адресов машины.

GetRAM очень похож на GetIPAddress за исключением того, что запрашиваемые строки различны. Как и в предыдущем случае, в связанном сервисном объекте WMI работает ExecQuery. Листинг 4 показывает реализацию GetIPAddress и GetRAM.

Листинг 4

Function GetIPAddress (server, username, password) set objLocator = WScript.CreateObject("WbemScripting.SWbemLocator") set objService = objLocator.ConnectServer (server, "", username, password) strQuery = _ "Select IPAddress from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE" set objEnumerator = objService.ExecQuery(strQuery) for each obj in objEnumerator if Not IsNull(obj.IPAddress) then for i=LBound(obj.IPAddress) to UBound(obj.IPAddress) GetIPaddress = obj.IPAddress(i) next end if next end function function GetRAM (server, username, password) set objLocator = WScript.CreateObject("WbemScripting.SWbemLocator") set objService = objLocator.ConnectServer (server, username, password) strQuery = "Select TotalPhysicalMemory From Win32_LogicalMemoryConfiguration" set objEnumerator = objService.ExecQuery(strQuery) for each obj in objEnumerator GetRam = obj.totalPhysicalMemory next end function

Чтобы завершить скрипт, сохраните код в файл logon.wsf (или другой, как хотите). Его следует поместить в \\server\NETLOGON. Это каталог, который Windows NT будет использовать в поисках файлов типа загрузочных скриптов. Заметьте, что не-W2K-серверы могут не исполнять иных файлов, кроме командных и ВАТ-файлов. В этом случае вам придется написать простой logon.bat, который вызывает cscript.exe.

Возможно, будет мудро заменить две функции WMI из Листинга 4 на Windows Script Components.

WSH и Active Directory Service Interfaces (ADSI)

Active Directory работает под Windows 2000. Но клиентские приложения, в нашем случае - скрипты, могут быть запущены и из-под Windows 95, Windows 98 или Windows NT 4.0. Для всех этих ОС существуют клиентские компоненты, которые, как и важную дополнительную информацию, можно получить с WWW-сайта MSDN (см. адрес выше).

Теперь, когда у вас есть загрузочный скрипт, осталось понять, зачем он вам нужен? Представьте, что вам нужно создать 5000 учетных записей пользователей вашей компании, причем, как обычно, вчера! Нет проблем! Сейчас мы покажем, как создавать группы пользователей и учетные записи пользователей Windows NT, и как вносить нужных пользователей в нужные группы.

Если посмотреть на имена пользователей и группы вашего NT-сервера, легко заметить, что имеется несколько предварительно созданных групп, например, Administrators и Domain Users. Создать собственную группу на сервере или в домене несложно. Все, что требуется - указать Windows NT-компьютер, на котором вы собираетесь создавать группу и имя группы. В коде ниже демонстрируется пример функции CreateGroup, создающей такую группу. Чтобы получить ссылку на объект, с помощью которого можно управлять Active Directory, следует воспользоваться функцией GetObject. Воспользовавшись объектом, полученным от GetObject, можно добавить группу с нужным вам именем и ее описание. Важная строка кода - SetInfo, сохраняющая информацию на сервере:

Sub CreateGroup (ServerName, GroupName, GroupDesc) on error resume next err.clear set objServer = GetObject("WinNT://" & ServerName) set objGroup = objServer.Create("group", GroupName) objGroup.Description = GroupDesc objGroup.SetInfo if err users1.csv. После этого все русскоязычные атрибуты стали отображаться нормально.

В заключение несколько важных моментов:

Для запуска командлета New-ADUser необходимо предварительно импортировать модуль Active Directory для PowerShell. Делается это командой Import-Module ActiveDirectory, можно просто вставить эту строку в скрипт. Исключение составляет случай, когда вы запускаете скрипт из специальной оснастки «Модуль Active Directory для Windows PowerShell».

Модуль ActiveDirectory доступен на серверах под управлением Windows Server 2008R2/2012, а также на рабочих станциях Windows 7/8 c установленным пакетом администрирования RSAT.

Для работы модуля ActiveDirectory необходима веб-служба Active Directory (ADWS), предоставляющая веб-интерфейс для доступа к службе каталогов. По умолчанию эта служба устанавливается автоматически при добавлении ролей сервера AD DS и AD LDS на серверах под управлением Windows Server 2008R2 и выше. Для Windows Server 2003\2008 эту службу можно установить отдельно, скачав

Скрипт проходит по всем серверам из Active Directory , смотрит состав локальной группы Администраторы и сохраняет список в файл. Будет полезным для поддержания безопасности в среде с большим количеством серверов.

Пример скрипта Описание скрипта
1 - 4 Определяем переменные для дальнейшего использования.
1 Путь к файлу, в который будет сохранен результат.
2 Контейнер в Active Directory, в котором находятся учетные записи компьютеров серверов.
3 Создаем и хэш-массив. В Powershell необходимо делать до начала использования.
4 Создаем пустую переменную. Ее будем наполнять списком пользователей, которые входят в группу Администраторы.
6 - 21 Функция для поиска пользователей в группе Администраторы.
7 Функции будет передаваться имя сервера. Его будем сохранять в переменную $strcomputer
8 - 12 Создаем исключение для выполняемой операции. Если запрос не будет выполнен корректно, на экран будет выведено название сервера.
9 Обращаемся в WMI объекту win32_groupuser со списком групп Windows.
11 Если обращение к WMI выполнено с ошибкой (чаще всего из-за недоступности RPC), на экран будет выведено название сервера, к которому в данный момент идет обращение.
13 Условие, при котором проверяется существование переменной со списком групп, полученной в строчке 9
14 Создаем переменную, в которую войдет список пользователей группы Администраторы или Administrators (на серверах с английской версией).
15 - 18 Вытаскиваем пользователей из административной группы и удаляем лишнюю служебную информацию.
19 Функция возвращает список пользователей.
23 Создаем переменную и помещаем в нее список компьютеров, на которых будем искать администраторов. В данном примере, это компьютеры из Active Directory.
24 - 29 Извлекаем по одному сервера, которые были получены в строчке 23.
25 Запускаем функцию и передаем ей имя сервера. Результат работы записываем в переменную $UserList
26 Условие проверяет наличие значения переменной $UserList
27 Если список пользователей есть, добавляем его в массив $AdminList
31 - 35 Перебираем массив $AdminList и пополняем список серверов и администраторов для них.
32 Создаем переменную, в которую запишем имя сервера.
33 Создаем переменную, в которую поместим список пользователей для сервера из строчки 32.
34 В переменной $ToCSV находятся строчки для будущего файла. Каждая строчка — имя сервера и перечень администраторов, разделенные точкой с запятой.
37 - 39 Проверяем наличие в системе файла, в который хотим поместить результат работы скрипта. Если файл существует, удаляем его.
41 Создаем файл выгрузки и помещаем в него список администраторов.

В самом простом варианте создание новой учетной записи пользователя занимает примерно пару минут. Открываем оснастку «Active Directory – Users and Computers», заходим в нужное подразделение (OU), в меню выбираем Создать - Пользователь, вводим имя пользователя и пароль. Все, учетка готова, можно работать.
А теперь представьте, что таким образом вам надо создать не одну, а скажем 50 учетных записей, и делать это регулярно.

Поскольку наврядли кому-то нравится проводить время, тупо набирая учетные данные пользователей, то делаем простой вывод - процесс заведения пользователей надо автоматизировать . И поможет нам в этом PowerShell.

Итак, представим, что нам нужно срочно создать 50 однотипных учетных записей. Пишем вот такой скрипт:


$username=″student″
$count=1..50
foreach ($i in $count)
{ New-AdUser -Name $username$i -Path $org -passThru }

Запускаем скрипт, и в подразделении Students создается 50 пользователей с именами student1-student50. По умолчанию учетки создаются отключенными, и пользователи все равно будут вынуждены к вам обращаться для их активации. Попробуем этого избежать:


$username=″student″
$count=1..50
foreach ($i in $count)

-AccountPassword (ConvertTo-SecureString «p@$$w0rd» -AsPlainText -force) -passThru }

Здесь создаем учетные записи уже активными и задаем p@$$w0rd как пароль по умолчанию, а также указываем сменить его при первом входе в систему. Чтобы не передавать пароль в открытом виде, используем командлет ConvertTo-SecureString , который переводит текстовую строку в защищенный формат

Теперь сделаем наш скрипт чуть более гибким. Используя командлет Read-Host заставим наш скрипт запрашивать имя и количество пользователей:

$org=″OU=Students,DC=contoso,DC=com″


$count=1..$number
foreach ($i in $count)
{ New-AdUser -Name $username$i -Path $org

Учетные записи созданы, пользователи могут заходить в систему и работать. Теперь их надо настроить - добавить в группы безопасности, прописать домашний каталог, сценарии входа и т.п. Сделать это можно с помощью шаблона. Проще говоря, создаем шаблонную учетную запись, полностью настраиваем ее, а затем делаем с нее нужное количество копий с помощью параметра -Instance :

$template = Get-AdUser -Identity ″student″
$org=″OU=Students,DC=contoso,DC=com″
$username=Read-Host ″Enter name″
$number=Read-Host ″Enter number″

$count=1..$number
foreach ($i in $count)
{ New-AdUser -Name $username$i -UserPrincipalName $username$i -Path $org -Instance `
$template -Enabled $True -ChangePasswordAtLogon $true `
-AccountPassword (ConvertTo-SecureString ″p@$$w0rd″ -AsPlainText -force) -passThru }

Еще один способ автоматизировать создание учетных записей - импортировать их из CSV-файла. Этот способ подойдет в том случае, если вам предоставили список пользователей, и им надо завести учетные записи в соответствии с этим списком. Как правило, подобные списки создаются в Excel в виде таблицы со столбцами Имя, Должность, Отдел и т.п., примерно такого вида:

Наша задача - сохранить его в формате CSV и затем указать в скрипте с помощью командлета Import-CSV. Если ваш CSV-файл содержит все необходимые столбцы, то New-ADUser автоматически свяжет их с правильными атрибутами пользователя:

$csv = Import-CSV -Path ″C:\scripts\users.csv″
$csv | New-AdUser -Path $org -Enabled $True -ChangePasswordAtLogon $true `
-AccountPassword (ConvertTo-SecureString ″p@$$w0rd″ -AsPlainText -force) -passThru

Таким образом можно импортировать сотни новых пользователей за несколько секунд, но есть в этом методе и подводные камни:

  • Названия столбцов должны полностью совпадать с названиями атрибутов пользователя, например Name (Имя), Organization (Организация), Title (должность), иначе ничего не получиться. Полный список атрибутов можно посмотреть .
  • В таблице обязательно нужно указать SamAccountName, в противном случае будет выдана ошибка о том, что учетная запись уже существует.
  • Если атрибуты задаватьть в русской раскладке, как в нашем примере, то могут возникнуть проблемы с кодировкой. В решении этой проблемы мне помогло извлечение содержимго CSV-файла с помощью командлета Get-Content и сохранение его в другой CSV-файл: Get-Content users.csv >> users1.csv. После этого все русскоязычные атрибуты стали отображаться нормально.

И еще один немаловажный момент: для запуска командлета New-ADUser необходимо предварительно импортировать модуль Active Directory для PowerShell. Делается это командой Import-Module ActiveDirectory, можно просто вставить эту строку в скрипт. Исключение составляет случай, когда вы запускаете скрипт из специальной оснастки «Модуль Active Directory для Windows PowerShell».