Разное

Script powershell: Как писать и как запускать скрипты PowerShell

Содержание

Как писать и как запускать скрипты PowerShell

1. Написание скрипта

Скрипт PowerShell (не важно какой версии) — это текстовый файл с расширением *.ps1.

Вот пример простого Power Shell срипта (файл systemInfo.ps1):

# Retrieve WMI object for the operating system

Get-WmiObject Win32_OperatingSystem

Этот файл можно создавать и редактировать, например, в FAR Manager.

Обратите внимание, что FAR Manager хоть и может работать в консоли Power Shell, но выполняет из-под себя скрипты в окружении обычной Windows-консоли cmd. То есть, FAR Manager можно использовать только для создания и редактирования PowerShell скриптов, но не для запуска. Но прежде чем разочаровываться, прочитайте пункт 3.

2. Запуск срипта

Скрипт нужно выполнять из консоли Power Shell, а не из обычной консоли Windows. В консоли Power Shell необходимо перейти в каталог, где лежит скрипт (командами cd), и затем запустить сам скрипт, обязательно прописав перед ним символы «.\». Например, имеем путь к файлу скрипта d:\work\systemInfo.ps1. Тогда команды запуска будут выглядеть так:

d:

cd \

cd work

.\systemInfo.ps1

или так (просто указывается полный путь к скрипту):

d:\work\systemInfo.ps1

Скорее всего, при запуске скрипта появится следующая ошибка:

Не удается загрузить файл D:\work\systemInfo.ps1, так как выполнение скриптов запрещено для данной системы. Введите «get-help about_signing» для получения дополнительных сведений.

строка:1 знак: 18

+ CategoryInfo : NotSpecified: (:) [], PSSecurityException

+ FullyQualifiedErrorId : RuntimeException

Ошибка появляется из-за того, что по-умолчанию в Power Shell включена максимальная политика безопасности, которая позволяет выполнять команды PowerShell в командной строке, но не позволяет в той же командной строке выполнить скрипт с командами PowerShell.

Чтобы резрешить выполнение PowerShell скриптов, нужно создать *.bat файл, например enableScript.bat со следующим содержимым:

powershell -Command Set-ExecutionPolicy RemoteSigned

Этот *.bat файл можно выполнить в любой консоли: хоть в PowerShell, хоть в обычной cmd. После выполнения этого файла, PowerShell-скрипты станут запускаться в консоли PowerShell.

3. Запуск PowerShell-скрипта из обычной Windows-консоли cmd

Скрипт PowerShell можно выполнить и из обычной консоли Windows. Для этого можно воспользоваться командой:

Powershell -File ./systemInfo.ps1

Таким образом можно выполнять скрипты прямо из FAR Manager, и они будут работать.

Но тут есть небольшая тонкость. Параметр -File срабатывает только на локальных путях, даже если путь указан относительный «./». То есть, если *.ps1 — файл лежит на локальном диске C: или D:, то такой вызов будет работать. Но если попробовать выполнить скрипт, расположенный на доменном ресурсе, то скрипт не будет найден. Возможно, это исправят в следующих версиях PowerShell.

Примеры скриптов PowerShell для системного администрирования —

Управление дисками и файлами

Получение текущего расположения (Get-Location)

Чтобы определить путь к текущему каталогу, введите команду Get-Location.

PS> Get-Location
Path
—-
C:\Documents and Settings\PowerUser



PS> Get-Location

Path

—-

C:\Documents and Settings\PowerUser

Примечание

Командлет Get-Location аналогичен команде pwd в оболочке BASH. Командлет Set-Location аналогичен команде cd в Cmd.exe.

Настройка текущего расположения (Set-Location)

Команда Get-Location используется с командой Set-Location. Команда Set-Location позволяет вам указать расположение текущего каталога.

Set-Location -Path C:\Windows



Set-Location -Path C:\Windows

Обратите внимание, что после ввода команды вы не получите прямого отклика о действии команды. Большинство команд Windows PowerShell, выполняющих действия, практически не создают выходных данных, так как выходные данные не всегда полезны. Чтобы проверить успешность внесения изменения в каталог при вводе команды Set-Location, укажите параметр -PassThru при вводе команды Set-Location.

PS> Set-Location -Path C:\Windows -PassThru

Path
—-
C:\WINDOWS



PS> Set-Location -Path C:\Windows -PassThru

 

Path

—-

C:\WINDOWS

Параметр -PassThru можно использовать с некоторыми командами Set в Windows PowerShell для возврата сведений о результате, когда отсутствуют выходные данные по умолчанию.

Вы можете указать пути относительно текущего расположения так же, как и в большинстве командных оболочек UNIX и Windows. В стандартной нотации для относительных путей точка ( . ) представляет текущую папку, а две точки ( .. ) — родительский каталог текущего расположения.

Например, если вы находитесь в папке C:\Windows, точка ( . ) представляет C:\Windows, а две точки ( .. ) представляют C: . Текущее расположение можно изменить на корень диска C: путем ввода следующей команды:

PS> Set-Location -Path .. -PassThru

Path
—-
C:\



PS> Set-Location -Path .. -PassThru

 

Path

—-

C:\

Тот же метод работает для дисков Windows PowerShell, которые не являются дисками файловой системы, например HKLM: . В реестре в качестве расположения можно задать раздел HKLM\Software путем ввода следующего кода:

PS> Set-Location -Path HKLM:\SOFTWARE -PassThru

Path
—-
HKLM:\SOFTWARE



PS> Set-Location -Path HKLM:\SOFTWARE -PassThru

 

Path

—-

HKLM:\SOFTWARE

После этого можно изменить расположение каталога на родительский каталог, который является корнем диска Windows PowerShell HKLM: с помощью относительного пути:

PS> Set-Location -Path .. -PassThru

Path
—-
HKLM:\



PS> Set-Location -Path .. -PassThru

 

Path

—-

HKLM:\

Вы можете ввести Set-Location или использовать любой из встроенных псевдонимов Windows PowerShell для Set-Location (cd, chdir, sl). Пример:

sl -Path HKLM:\SOFTWARE -PassThru



sl -Path HKLM:\SOFTWARE -PassThru

Сохранение и отзыв последних расположений (Push-Location и Pop-Location)

При изменении расположения полезно отслеживать свое предыдущее расположение и иметь возможность вернуться к нему. Командлет Push-Location в Windows PowerShell создает упорядоченный журнал («стек») путей к каталогам, которые вы открывали, чтобы можно было вернуться по нему на шаг назад, используя дополнительный командлет Pop-Location.

Например, Windows PowerShell обычно запускается в корневом каталоге пользователя.

PS> Get-Location

Path
—-
C:\Documents and Settings\PowerUser



PS> Get-Location

 

Path

—-

C:\Documents and Settings\PowerUser

Чтобы передать текущее расположение в стек, а затем переместить его в папку локальных параметров, введите:

Push-Location -Path «Local Settings»



Push-Location -Path «Local Settings»

После этого можно передать расположение локальных параметров в стек и переместить его в папку Temp, введя следующее:

Чтобы убедиться, что каталоги изменены, введите команду Get-Location.

PS> Get-Location

Path
—-
C:\Documents and Settings\PowerUser\Local Settings\Temp



PS> Get-Location

 

Path

—-

C:\Documents and Settings\PowerUser\Local Settings\Temp

После этого можно перейти в последний открытый каталог, введя команду Pop-Location, и проверить изменение, введя команду Get-Location.

PS> Pop-Location
PS> Get-Location

Path
—-
C:\Documents and Settings\me\Local Settings



PS> Pop-Location

PS> Get-Location

 

Path

—-

C:\Documents and Settings\me\Local Settings

Как и в случае с командлетом Set-Location, можно включить параметр -PassThru при вводе командлета Pop-Location, чтобы открыть указанный каталог.

PS> Pop-Location -PassThru

Path
—-
C:\Documents and Settings\PowerUser



PS> Pop-Location -PassThru

 

Path

—-

C:\Documents and Settings\PowerUser

Кроме того, можно использовать командлеты расположения с сетевыми путями. Если у вас есть сервер FS01 с общей папкой Public, можно изменить расположение, введя

Set-Location \\FS01\Public



Set-Location \\FS01\Public

или диспетчер конфигурации служб

Push-Location \\FS01\Public



Push-Location \\FS01\Public

Чтобы изменить расположение на любой доступный диск, можно использовать команды Push-Location и Set-Location. Например, если у вас есть локальный дисковод компакт-дисков с буквой диска D, содержащий компакт-диск с данными, вы можете изменить расположение на него, введя команду Set-Location D: .

Если дисковод пуст, вы получите следующее сообщение об ошибке:

PS> Set-Location D:
Set-Location : Cannot find path ‘D:\’ because it does not exist.



PS> Set-Location D:

Set-Location : Cannot find path ‘D:\’ because it does not exist.

 

Работа с файлами и папками. Получение списка файлов и папок, содержащихся в папке.

Извлечь все элементы непосредственно из папки можно с помощью командлета Get-ChildItem. Для отображения скрытых и системных элементов добавьте необязательный параметр Force. Например, эта команда отображает непосредственное содержимое диска C Windows PowerShell (которое совпадает с содержимым физического диска C Windows):

Get-ChildItem -Path C:\ -Force



Get-ChildItem -Path C:\ -Force

Эта команда выводит только элементы, содержащиеся на диске непосредственно, так же как и команда DIR оболочки Cmd.exe или команда ls оболочки UNIX. Для показа вложенных элементов необходимо также указать параметр -Recurse. (Время выполнения этой операции будет очень велико.) Для вывода всего содержимого диска C введите:

Get-ChildItem -Path C:\ -Force -Recurse



Get-ChildItem -Path C:\ -Force -Recurse

Командлет Get-ChildItem позволяет отфильтровать элементы с помощью параметров PathFilterInclude и Exclude, но обычно осуществляется лишь фильтрация по имени. Сложную фильтрацию на основе других свойств элементов можно выполнить с помощью Where-Object.

Следующая команда находит все исполняемые файлы в папке Program Files, которые были в последний раз изменены после 1 октября 2005 г. и размер которых не менее одного мегабайта и не более десяти мегабайт:

Get-ChildItem -Path $env:ProgramFiles -Recurse -Include *.exe | Where-Object -FilterScript {($_.LastWriteTime -gt ‘2005-10-01’) -and ($_.Length -ge 1mb) -and ($_.Length -le 10mb)}



Get-ChildItem -Path $env:ProgramFiles -Recurse -Include *.exe | Where-Object -FilterScript {($_.LastWriteTime -gt ‘2005-10-01’) -and ($_.Length -ge 1mb) -and ($_.Length -le 10mb)}

Копирование файлов и папок

Копирование выполняется с помощью командлета Copy-Item. Следующая команда создает резервную копию C:\boot.ini в C:\boot.bak:

Copy-Item -Path C:\boot.ini -Destination C:\boot.bak



Copy-Item -Path C:\boot.ini -Destination C:\boot.bak

Если целевой файл уже существует, то попытка копирования завершается неудачей. Чтобы перезаписать имеющийся целевой файл, используйте параметр Force.

Copy-Item -Path C:\boot.ini -Destination C:\boot.bak -Force



Copy-Item -Path C:\boot.ini -Destination C:\boot.bak -Force

Эта команда работает, даже если целевой объект доступен только для чтения.

Так же выполняется и копирование папок. Эта команда копирует папку C:\temp\test1 в новую папку C:\temp\DeleteMe рекурсивно.

Copy-Item C:\temp\test1 -Recurse C:\temp\DeleteMe



Copy-Item C:\temp\test1 -Recurse C:\temp\DeleteMe

Можно также скопировать избранные элементы. Следующая команда копирует все файлы TXT, содержащиеся в папке C:\data, в папку C:\temp\text:

Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination C:\temp\text



Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination C:\temp\text

Для копирования элементов файловой системы можно использовать и другие средства. В Windows PowerShell по-прежнему работают команды XCOPY, ROBOCOPY и такие COM-объекты, как Scripting.FileSystemObject. Например, можно воспользоваться COM-классом Scripting.FileSystem сервера сценариев Windows для создания резервной копии файла C:\boot.ini в файле C:\boot.bak:

(New-Object -ComObject Scripting.FileSystemObject).CopyFile(‘C:\boot.ini’, ‘C:\boot.bak’)



(New-Object -ComObject Scripting.FileSystemObject).CopyFile(‘C:\boot.ini’, ‘C:\boot.bak’)

Создание файлов и папок

Создание новых элементов осуществляется одинаковым образом всеми поставщиками Windows PowerShell. Если поставщик Windows PowerShell поддерживает более одного типа элементов (например, поставщик Windows PowerShell FileSystem различает каталоги и файлы), необходимо указать тип элемента.

Эта команда создает папку C:\temp\New Folder:

New-Item -Path ‘C:\temp\New Folder’ -ItemType Directory



New-Item -Path ‘C:\temp\New Folder’ -ItemType Directory

Эта команда создает пустой файл C:\temp\New Folder\file.txt.

New-Item -Path ‘C:\temp\New Folder\file.txt’ -ItemType File



New-Item -Path ‘C:\temp\New Folder\file.txt’ -ItemType File

Важно!

При использовании параметра Force с командой New-Item для создания папки, которая уже существует, она не перезапишет и не заменит папку. Будет просто возвращен имеющийся объект папки. Однако, если использовать New-Item -Force в уже имеющимся файле, файл будет полностью перезаписан.

Удаление всех файлов и папок, содержащихся в папке

Удалить вложенные элементы можно с помощью командлета Remove-Item, однако он потребует подтверждения удаления, если элемент сам что-нибудь содержит. Например, при попытке удаления папки C:\temp\DeleteMe, которая содержит другие элементы, Windows PowerShell предварительно предложит подтвердить удаление этой папки:

Remove-Item -Path C:\temp\DeleteMe

Confirm
The item at C:\temp\DeleteMe has children and the Recurse parameter was not
specified. If you continue, all children will be removed with the item. Are you
sure you want to continue?
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help
(default is «Y»):



Remove-Item -Path C:\temp\DeleteMe

 

Confirm

The item at C:\temp\DeleteMe has children and the Recurse parameter was not

specified. If you continue, all children will be removed with the item. Are you

sure you want to continue?

[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help

(default is «Y»):

Если подтверждение для каждого вложенного элемента нежелательно, задайте параметр Recurse:

Remove-Item -Path C:\temp\DeleteMe -Recurse



Remove-Item -Path C:\temp\DeleteMe -Recurse

Подключение локальной папки как диска

Отобразить локальную папку можно с помощью команды New-PSDrive. Следующая команда создает локальный диск P:, корневым каталогом которого является локальный каталог Program Files, отображающийся только в сеансе PowerShell:

New-PSDrive -Name P -Root $env:ProgramFiles -PSProvider FileSystem



New-PSDrive -Name P -Root $env:ProgramFiles -PSProvider FileSystem

Как и при использовании сетевых дисков, диски, отображенные в Windows PowerShell, немедленно становятся доступными оболочке Windows PowerShell. Чтобы создать подключенный диск, отображающийся в проводнике, нужен параметр -Persist. Но с этим параметром можно использовать только удаленные пути.

Чтение текстового файла в массив

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

PS> Get-Content -Path C:\boot.ini
[boot loader]
timeout=5
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=»Microsoft Windows XP Professional»
/noexecute=AlwaysOff /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=» Microsoft Windows XP Professional
with Data Execution Prevention» /noexecute=optin /fastdetect



PS> Get-Content -Path C:\boot.ini

[boot loader]

timeout=5

default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS

[operating systems]

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=»Microsoft Windows XP Professional»

/noexecute=AlwaysOff /fastdetect

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=» Microsoft Windows XP Professional

with Data Execution Prevention» /noexecute=optin /fastdetect

Командлет Get-Content сразу рассматривает данные, считанные из файла, как массив с одним элементом на строку содержимого файла. Убедиться в этом можно, проверив свойство Length полученного содержимого:

PS> (Get-Content -Path C:\boot.ini).Length
6



PS> (Get-Content -Path C:\boot.ini).Length

6

Эта команда наиболее полезна для непосредственного ввода в Windows PowerShell информационных списков. Например, можно хранить в файле C:\temp\domainMembers.txt список имен компьютеров или IP-адресов по одному имени на каждую строку файла. Вы можете использовать командлет Get-Content, чтобы извлечь содержимое файла и поместить его в переменную $Computers:

$Computers = Get-Content -Path C:\temp\DomainMembers.txt



$Computers = Get-Content -Path C:\temp\DomainMembers.txt

Теперь переменная $Computers представляет собой массив, содержащий в каждом элементе имя компьютера.

Работа с файлами, папками и разделами реестра

Перечисление файлов, папок и разделов реестра (Get-ChildItem)

Так как получение коллекции элементов из определенного расположения является обычной задачей, командлет Get-ChildItem разработан специально для возврата всех элементов, найденных в контейнере, например в папке.

Если необходимо вернуть все файлы и папки, которые находятся непосредственно в папке C:\Windows, введите:

PS> Get-ChildItem -Path C:\Windows
Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\Windows

Mode LastWriteTime Length Name
—- ————- —— —-
-a— 2006-05-16 8:10 AM 0 0.log
-a— 2005-11-29 3:16 PM 97 acc1.txt
-a— 2005-10-23 11:21 PM 3848 actsetup.log



PS> Get-ChildItem -Path C:\Windows

    Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\Windows

 

Mode                LastWriteTime     Length Name

—-                ————-     —— —-

-a—        2006-05-16   8:10 AM          0 0.log

-a—        2005-11-29   3:16 PM         97 acc1.txt

-a—        2005-10-23  11:21 PM       3848 actsetup.log

Списки выглядят аналогично тем спискам, которые появляются при вводе команды dir в Cmd.exe или команды ls в командной оболочке UNIX.

С помощью параметров командлета Get-ChildItem можно создавать очень сложные списки. Далее рассмотрим несколько сценариев. Синтаксис командлета Get-ChildItem можно увидеть, введя:

Выбираем среду разработки на PowerShell и пишем скрипты для Windows — «Хакер»

Содержание статьи

В администрировании всегда есть место творчеству. Хочешь сделать какую-нибудь автоматизацию рутинной задачи? Пожалуйста! Нужно что-то регулярно проверять на активность? Не вопрос! Хочешь обработать какой-нибудь гигантский отчет и вывести только актуальные данные? Тоже можно. Все эти и многие другие задачи лучше всего решать при помощи скриптов, и язык PowerShell в случае с Windows — оптимальный выбор.

 

Что такое PowerShell и чем он хорош

Пользователи UNIX и Linux, а с какого-то момента и macOS привыкли к тому, что под рукой всегда есть Bash — немного старомодное, но универсальное и мощное средство, при помощи которого всего парой строк можно творить удивительные вещи. Прописываешь новый скрипт в cron — и готово, он уже крутится на твоем компьютере или на сервере и незаметно делает что-нибудь полезное.

Возвращаясь в Windows (а без этого иногда никак), понимаешь, что скрипты .bat хоть и хороши, но спасают не всегда: очень уж ограниченны их возможности. И если ты до сих пор считал, что PowerShell — это неведомая штуковина, ради которой нужно что-то там поднимать и настраивать, то не спеши с выводами — он, если разобраться, совсем неплох.

Windows PowerShell — это расширяемое средство автоматизации с открытыми исходниками, которое состоит из оболочки (командной строки) и скриптового языка. Впервые он был показан в 2003 году (тогда он назывался Monad). PowerShell 2.0 вышел в составе Windows 7 и Windows Server 2008 R2 и с тех пор присутствует в Windows в качестве стандартного компонента. Его даже включили в Windows XP SP3. PowerShell построен на основе .NET Framework и интегрирован с ним. PowerShell может обращаться к COM, WMI и ADSI, а также, конечно же, исполняет консольные команды.

В общем, «пошик» имеет крепкие связи с продуктами Microsoft, будь то Active Directory или почтовый сервер Exchange. Это позволяет без подключения к оснастке сервера обращаться к ним через консоль и отдавать команды.

Если раньше ты не интересовался PowerShell, то, скорее всего, у тебя стоит вторая версия. Я рекомендую обновиться как минимум до третьей — она содержит куда больше возможностей и полезных фишек. Если не вдаваться в подробности, то в PowerShell 2.0 входит около десятка модулей и примерно 350 команд, а в PowerShell 3.0 уже около 2300 командлетов из более чем 70 модулей. «Хакер» также писал о том, чем отличается самый новый PowerShell пятой версии из Windows 10.

 

Выбираем среду разработки и инструменты

Теперь давай разберемся, где удобнее всего писать код. Можно, конечно, и в «Блокноте», Notepad++ или Sublime. Но это в данном случае не самый грамотный выбор редактора. Лучше всего начинать знакомство с PowerShell, вооружившись идущим в комплекте PowerShell ISE.

PowerShell ISE

Это даже не редактор, а практически полноценная среда разработки. Здесь есть функция IntelliSense, которая позволяет просматривать перечень командлетов и их параметров, переменных, утилит и прочего. Поддерживаются сниппеты, есть возможность расширения набора функций за счет различных аддонов. Очень полезно и окно Commands. В нем можно составлять команды в визуальном режиме: выбираешь модуль, находишь нужный командлет и задаешь ему необходимые параметры. Получившуюся команду можно скопировать в консоль или сразу запустить на выполнение. В общем, этакий конструктор для админа. Ну и конечно, есть подсветка синтаксиса, дебаггер и многое другое.

Тем не менее у PowerShell ISE есть и достойные конкуренты. Один из них — Dell PowerGUI.

PowerGUI — это визуальное дополнение к PowerShell. Оно упрощает сборку собственных сценариев до выбора необходимых командлетов. Берешь то, что нужно для решения задачи, и перетаскиваешь части кода, пока не получишь скрипт. Одна из главных фишек PowerGUI — это Power Packs, готовые скрипты, опубликованные сообществом пользователей и выложенные в свободный доступ. Тут есть и простенькие команды вроде добавления пользователей, и сложные — к примеру, управление свитчами и виртуальными машинами. Все их легко дополнять и модифицировать в соответствии с нуждами.

powergui

PowerShell Studio 2015 фирмы Sapien — более продвинутая среда, которая рассчитана на совместную разработку одного проекта большим количеством участников. Если ты когда-нибудь имел дело с Visual Studio, то, думаю, заметишь сходство. Среди полезных фишек PowerShell Studio — панель Ribbon, поддержка удаленной отладки, а также функции компилятора, которые позволяют включить скрипты в исполняемые файлы. Есть поддержка разных версий PowerShell.

PowerShell Studio 2015

Стоит упомянуть и Script Browser для Windows PowerShell ISE. Это не среда разработки, но весьма интересный инструмент, разработанный в Microsoft. Script Browser открывает доступ к базе готовых скриптов, которые можно использовать в качестве образцов для написания своего кода. А еще эта штука умеет анализировать код, который ты пишешь, и подсказывает, как его улучшить.

Script Browser для Windows PowerShel

 

Несколько полезных трюков

Разобравшись с редактором, можно приступать к написанию кода. PowerShell — несложный язык, и, я думаю, ты быстро разберешься, что к чему. Команды здесь называются командлетами, и каждый из них состоит из двух частей. Сначала идет действие, например Get, Set, Add, Invoke, Remove. Затем указывается то, на что действие направлено: Service, VM, AzureAccount, DHCPServerSetting. Каждая часть отделяется от другой дефисом. Получается, к примеру, get-process. Это, кстати, полезная команда, которая выводит список процессов. Скажем, если написать

get-process BadTh*

увидим что-то такое:

Handles  NPM(K)  PM(K)    WS(K)    VM(M)  CPU(s)  Id    ProcessName
———      ———     ———      ———      ———    ———     ———   ———
28       4       -210844  -201128  -163   25.67   2792  BadThread

INFO

Если при наборе команды нажать Tab, то редактор дополнит команду — так же, как в консоли. Двойное нажатие на Tab выведет список подходящих команд.

Теперь можно завершить зависший процесс:

stop-process -id 2792

Хочешь посмотреть права на директорию? Сделать это помогает такой командлет:

E:>Get-Acl N:Data

Можно просмотреть рекурсивно, правда уже чуть с более сложной логикой:

E:>Get-ChildItem N:Data -recurse | Get-Acl

Если не можешь понять, что делает какой-то командлет, напиши следующее (заменив Get-Process на название неизвестного командлета):

Get-Help -Name Get-Process

Можно также выполнить

Get-Help -Name Get-*

В этом случае будет выведен весь список возможных вариантов.

Теперь давай попробуем узнать что-нибудь о нашем домене через консоль PowerShell. К примеру, давай посмотрим пользовательские аккаунты, у которых установлен неистекающий пароль:

Search-ADAccount -PasswordNeverExpires | FT Name,  ObjectClass, UserPrincipalName

Кстати, к каждому полю в окошке опции учетной записи или компьютера можно обратиться и считать данные. Таким образом можно делать целые срезы. Вот, к примеру, запрос на основе данных о телефонных номерах:

Get-AdUser -Filter * -Properties OfficePhone | FT OfficePhone,UserPrincipalName

 

PowerShell в сравнении с bat

Иногда задачу можно решить как старым дедовским методом, так и при помощи PowerShell. Я рекомендую не лениться и использовать PS, хотя бы просто потому, что так ты его быстрее изучишь и сможешь применять в более сложных ситуациях. К тому же ты постепенно оценишь его синтаксис — более элегантный и консистентный. Вот несколько примеров, как вещи делались раньше и как их можно сделать при помощи PowerShell.

Следующая командная строка перезагрузит компьютер с задержкой в десять секунд:

shutdown /r /m \\SERVER1 /f /t 10

На PowerShell это будет выглядеть вот так:

Start-Sleep 10
Restart-Computer -Force -ComputerName SERVER1

Вот так через bat можно перезагрузить службу dnscache (или любую другую):

sc stop dnscache
sc start dnscache

В PowerShell это будет так:

Restart-Service dnscache

Мап диска в bat:

Net use L: \\server1\c$

И в PowerShell:

New-PSDrive -name L -psprovider FileSystem -root \\server1\c$

Да, иногда приходится печатать чуть больше букв, но читаются команды PS гораздо лучше. И это не говоря уже про разные новые возможности.

 

Удаленное управление с PowerShell

В основном описанные в статье команды выполняются на том же компьютере, на котором они запущены. Проще говоря, команды для управления AD выполнять нужно на сервере, где контроллер домена и установлен, что, согласись, на корню рубит удобство и автоматизацию. Для выполнения команд удаленно, что нам и требуется, надо пользоваться специальными командлетами. К примеру, для подключения к удаленному компьютеру и перезапуску там спулера печати вводи

Enter-PSSession -ComputerName SRV4
Restart-Service -Name spooler

Более подробно читай тут.

 

Что почитать еще

Книжек и прочих обучающих материалов по PowerShell огромное количество. Есть как справочники, так и учебные туториалы. Начать можно с сайта Microsoft, где есть неплохие видеоуроки.

В деле немало поможет и книга «Master-PowerShell» Тобиаса Велтнера. В ней автор охватывает многие понятия вроде массивов, хеш-таблиц, конвейеров, объектов, функций, обработки ошибок, регулярных выражений и так далее. Заодно подробно рассматривается XML и разные аспекты администрирования. Увы, на русский эта книга не переведена.

Из русскоязычных мануалов по PowerShell мне попадался «Windows PowerShell 2.0. Справочник администратора» Уильяма Станека — он весьма неплох.

На «Хабрахабре» есть перевод полезной статьи Джеффери Хикса об администрировании Active Directory при помощи PowerShell.

 

Итого

Как видишь, все не так сложно, как кажется на первый взгляд. Главное — четко понимать, что нужно на выходе, и на этом основании выбирать командлеты. А с удобным редактором это делать куда легче. Доступность разнообразных заготовок может заметно упростить решение повседневных задач администрирования. Знания «пошика» прокачаешь по ходу дела, а это в работе с Windows совсем не лишнее.

Запуск скрипта PowerShell

PowerShell — это новая командная оболочка для Windows, которая по задумкам Microsoft должна вытеснить и заменить cmd. По-умолчанию, эта оболочка уже идет в составе Windows 7 и выше. Если у вас более старая операционная система или вы просто хотите скачать более свежую версию PowerShell, сделать это можно здесь: https://technet.microsoft.com/en-us/scriptcenter/dd742419.aspx

Как запустить скрипт PowerShell?

Есть несколько различных способов запуска скрипта, ниже приведены основные:

  1. Запустить оболочку PowerShell и в ней запустить скрипт (ввести путь до файла и имя файла, например, так: C:\Scripts\test.ps1, или перейти в папку скрипта командой cd C:\Scripts и запустить его командой .\test.ps1)Оболочку можно найти и запустить множеством способов. Один из способов — через меню «Пуск». Для Windows 7 — нужно зайти во «Все программы» — «Стандартные» — «Windows PowerShell» и запустить оболочку «Windows PowerShell». Для Windows 10 — нужно найти группу на букву «W» и в ней вы найдете «Windows PowerShell».
  2. Запустить «Интегрированную среду сценариев Windows PowerShell ISE» — это программа — среда разработки, позволяющая редактировать и отлаживать скрипты PowerShell, которая так же есть по-умолчанию вместе с самим PowerShell. Запустив ее, нужно просто нажать кнопку «Открыть» или зайти в меню Файл — Открыть и выбрать нужный скрипт, затем нажать F5 или кнопку «Выполнить скрипт».Найти Windows PowerShell ISE можно там же, где и оболочку PowerShell — в меню «Пуск».
  3. Запустить стандартную коммандную строку и в ней написать:
    powershell -file <имя_скрипта> (пример: powershell -file myscript.ps1)

Если вы раньше не запускали скрипты PowerShell, то скорее всего, вы получите сообщение: Не удается загрузить файл <имя_скрипта>, так как выполнение скриптов запрещено для данной системы. Введите «get-help about_signing» для получения дополнительных сведений. Связано это с тем, что из соображений безопасности и недопущения случайного выполнения вредоносного кода, все скрипты должны быть подписаны цифровой подписью.

Как разрешить выполнение неподписанного скрипта PowerShell?

1. В оболочке PowerShell, перед тем как запускать скрипт, выполнить команду, разрешающую выполнение неподписанных скриптов для текущего сеанса оболочки:

Set-ExecutionPolicy RemoteSigned -Scope Process

2. При запуске из стандартной коммандной строки использовать параметр -executionpolicy, т.е. запускать скрипт так:

powershell -executionpolicy RemoteSigned -file <имя_скрипта>

Оба способа устанавливают политику только для текущего сеанса, при этом, политика безопасности выполнения скриптов PowerShell, прописанная в реестре, не будет изменена и останется прежней. Если вы хотите поменять политику безопасности выполнения скриптов «на постоянно», то используйте такой способ:

3. Разрешить запуск навсегда: запустить оболочку PowerShell от имени «Администратора», затем выполните команду:

Set-ExecutionPolicy RemoteSigned

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

Примечание: Если скрипт был загружен из интернета, то чтобы избежать запроса на подтверждение запуска, нужно вместо RemoteSigned использовать Bypass — полное отключение любых запросов и предупреждений.

Как запустить скрипт PowerShell в фоновом режиме?

Для этого достаточно использовать параметр запуска -WindowStyle, который может принимать значения: Normal, Minimized, Maximized и Hidden. Таким образом, чтобы запустить неподписанный скрипт в фоновом режиме, нужно выполнить команду:

powershell -executionpolicy RemoteSigned -WindowStyle Hidden -file <имя_скрипта>

Так же можно еще при желании добавить -NonInteractive, чтобы скрипт не задавал никаких вопросов. Таким образом, скрипт выполнится незаметно для пользователя. Будmте внимательны, используя такой способ.

Запуск скрипта PowerShell c параметрами

Собственно запуск нужно делать как если бы вы запускали обычную программу или bat-файл с параметрами. Например, для запуска скрипта с параметрами из командной, можно написать такую команду:

powershell -executionpolicy RemoteSigned -file <имя_скрипта> param1 param2 «еще один текстовый параметр»

В самом скрипте вы можете получить эти параметры так:


param ($var1, $var2, $var3)
echo $var1, $var2, $var3

В интегрированной среде PowerShell ISE запустить скрипт с параметрами можно аналогично, используя область команд.

Как запустить скрипт PowerShell с помощью ярлыка?

Осуществить такую задачу можно двумя способами:

  1. Создать bat/cmd файл, в котором прописать команду для запуска скрипта (с параметрами вы ознакомились выше)
  2. Создать ярлык на PowerShell, который можно найти в папке c:\Windows\System32\WindowsPowerShell\v<версия>\ и в свойствах ярлыка в поле «Объект» дописать необходимые параметры.

Таким образом, например, чтобы запустить скрипт powershell при входе пользователя, можно просто создать ярлык, как описано во 2-м пункте и поместить его в автозагрузку. Так же, создание ярлыка одним из способов выше позволит легко запустить скрипт от имени администратора или от имени любого другого пользователя как обычную программу.

Скриптовый язык PowerShell — довольно мощный инструмент для решения различных задач, но его можно использовать не только для хороших вещей, но и во вред, поэтому, пользуйтесь им с умом 😉

 

Как запустить скрипт PowerShell

Бывают случаи когда для выполнения каких либо задач функционала утилит CSVDE и LDIFDE недостаточно и для решения задачи необходимо использовать PowerShell. Если задача не тривиальная и требует ввода большого количества команд, удобней записать их в один файл и запустить этот файл из PowerShell, чем вводить все в одну строку. Как сделать скрипт и запустить его в PowerShell?- на этот вопрос вы найдете ответ, если прочитаете статью.

Для того чтобы запустить скрипт PowerShell необходимо сделать текстовый файл (txt), набрать в нем необходимые команды, после этого сменить расширение файла на PS1. Если возникли проблемы с изменением расширения файла- оно не отображается, рекомендую прочитать статью- Как сделать видимым расширение файлов.

Теперь необходимо запустить PowerShell («Пуск- Все программы- Стандартные- Windows Power Shell«) и перейдите в папку со скриптом CD D:/ (в данном примере скрипт расположен в корне диска D), после этого запускаем скрипт .\<имя скрипта> например: .\script.ps1. Можно другим способом,  запустить скрипт PowerShell- прописать весь путь, например D:/script.ps1

При первом запуске выполнении скрипта увидите ошибку:

Не удается загрузить файл <путь к вашему файлу>, так как выполнение скриптов запрещено для данной системы. Введите «get-help about_signing» для получения дополнительных сведений.

Чтобы запускать созданные собою скрипты, необходимо либо использовать сертификат более подробно об этом можно узнать если запустит команду get-help about_signing, либо разрешить выполнение ненадежных скриптов с помощью команды Set-ExecutionPolicy remotesigned и подтверждением (Внимание!!! для выполнения этой команды необходимо запустить PowerShell с правами администратора). После этого можно вновь запустить выполнения скрипта.

Я очень надеюсь, моя статья помогла Вам! Просьба поделиться ссылкой с друзьями:

PowerShell Скрипты — примеры автоматизации

В этой записи буду складировать свои (и не только свои) небольшие PowerShell скрипты, которые не настолько велики, чтоб им посвящать отдельную запись.

Скрипты будут достаточно полезны в качестве примеров для создания скриптов со схожим функционалом.

Windows Powershell — оснастка командной строки и скриптовый язык для различной автоматизации задач и администрирования в windows. Официальный сайт — microsoft.com/powershell

Удаление всех бекапов кроме трех последних

На сервере локально сохраняются бекапы, где папки именуются таким образом: «klbackup2014-01-22#23-00-00». PowerShell скрипт переносит эти папки на сетевой диск и хранить не более 3-х последних бекапов.

Copy-Item "C:\backups\klbackup*\" "\\Server\Backups\klBackup\" -force -recurse -ErrorAction stop
Remove-Item "C:\backups\klbackup*" -force -recurse
$folders = Get-ChildItem "\\Server\Backups\klBackup\klbackup*"
$i = 0
While ($i -lt $folders.count-3) {
   Remove-Item $folders[$i] -force -recurse
   $i++
}

Удаляем файлы старше трех месяцев

$date = (Get-Date).AddMonths(-3)
Get-ChildItem -Path D:\Files\Common | where {!$_.PSIsContainer} |
foreach {
   if ($_.LastWriteTime -lt $date) {
      # в тестовых целях указываем -whatif
      # когда убедимся что все корректно работает то убираем его
      Remove-Item $_ -whatif
   }
}

Разрешение скачанного изображения

PowerShell скрипт скачивает изображение из Интернета и отображает ее разрешение

Function Get-Image{
   begin{[void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") |Out-Null}
   process{
      $fi=[System.IO.FileInfo]$_
      if( $fi.Exists){
         $img = [System.Drawing.Image]::FromFile($_)
         $img.Clone()
         $img.Dispose()
      }else{Write-Host "File not found: $_" -fore yellow }
   }
   end{}
}

#Скачиваем файл
$webclient = New-Object System.Net.WebClient
$url = "http://cs418720.userapi.com/v418720852/20d0/DiSlb-_mVBg.jpg"
$file = "D:\ImageSize.jpg"
$webclient.DownloadFile($url,$file)

#Получаем ширину и высоту изображения
$image = $file | Get-Image
$Width = $image.Width
$Height = $image.Height
#Вывод на экран
write-output “Width:$Width, Height:$Height"

Среднее арифметическое трех последних чисел

Из файла, в котором содержаться в каждой строке по числу, нужно получить три последние числа и выдать их среднее арифметическое.

$date = Get-Date -format yyyy-MM-dd
$filename = "C:\Program Files\Zabbix\CheckHost_INET-" + $date + ".res"
$file = Get-Content $filename #считываем файл в переменную. В файле каждая строка содержит по числу.
$lenght = $file.count #получаем количество строк файла
$avg=([int]$file[$lenght-1]+[int]$file[$lenght-2]+[int]$file[$lenght-3])/3 #вычисляем арифметическое среднее трех последних чисел
Write-Host([int]$avg) #выводим среднее арифметическое с откидыванием дроби

Количество файлов в папках и размер папок

PowerShell скрипт выводит на экран и в файл D:\CountFiles.csv информацию о том, сколько содержит файлов каждая папка и подпапки в директории D:\Photos, а также размер этих папок и подпапок. csv файл можно импортировать в exel или гугл-таблицы и отсортировать столбцы по возрастанию или спаданию. Скрипт может пригодиться при оптимизации файлового хранилища.

$source="D:\Photos"
Get-ChildItem $source -recurse -force | where {$_.psIscontainer} | foreach {
   $count = Get-ChildItem $_.fullname -recurse | where {$_.length} | Measure-Object -property length -Sum
   Write-Host($_.FullName)
   $FilesSize = '{0:F}' -f ((($count.Sum)/1024)/1024)
   Write-Host("Files: " + $count.count )
   Write-Host("Size: " + $FilesSize + " MB")
   '"' + $_.FullName + '","' + $count.count + '","' + $FilesSize + '"' | Out-File D:\CountFiles.csv -Append
}

Случайный афоризм из файла

#Автор скрипта: https://elims.org.ua
#читаем содержимое файла в масив построчно и берем случайную строку
$file = Get-Content "C:\aphorism.txt"
$aphorism = Get-Random -input $file #берем случайный афоризм из массива афоризмов
$tag = Get-Random -input " #афоризмы"," #цитаты", " #цитаты" #берем случайный тег
$aphorism = $aphorism + $tag
Write-Host($aphorism)

Отображение mp3-файлов с низким битрейтом

PowerShell скрипт выводит список mp3-файлов, которые находятся в папке D:\vk-music\ и имеют битрейт мене 320

#скрипт выводит список mp3-файлов, которые находятся в папке D:\vk-music\ и имеют битрейт мене 320 
$objShell = New-Object -ComObject Shell.Application
$mp3files = Get-ChildItem "D:\vk-music\" -include "*.mp3" -recurse #получили список mp3-файлов
foreach($mp3Item in $mp3files){ #для каждого файла из списка
 $file = split-path $mp3Item -leaf #из полного имени вырезали имя файла
 $path = split-path $mp3Item #из полного имени вырезали адрес папки
 $objFolder = $objShell.namespace($path)
 $objFile = $objFolder.parsename($file)
 if ($objFolder.getDetailsOf($objFile, 28)) { # 28 - номер свойства файла, в котором хранится информация о битрейте
  $bitrate = [int]$objFolder.getDetailsOf($objFile, 28).Substring(1,3) #из строки, где хранится битрейт, вырезаем числовое значение битрейта
  if ($bitrate -lt 320) { #если битрейт меньше 320
   "№" + ++$i + ' bitrate: ' + $bitrate + " file: " + [string]$mp3Item #выводим битрейт и полное имя файла
  }
 }
}

Удаление изображений с плохим качеством

Удаляем в указанных папках (рекурсивно) изображения jpg с худшим качеством чем HD Ready

Function Get-Image{
 begin{[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") |Out-Null}
 process{
 $fi=[System.IO.FileInfo]$_
 if( $fi.Exists){
 $img = [System.Drawing.Image]::FromFile($_)
 $img.Clone()
 $img.Dispose()
 }else{Write-Host "File not found: $_" -fore yellow }
 }
 end{}
}

$paths = @()
$paths = $paths + "D:\Folder1\"
$paths = $paths + "E:\Folder2"
$paths = $paths + "X:\Folder3\"

Foreach ($path in $paths) { 
 Get-ChildItem -Path $path -recurse -filter *.jpg | where {!$_.PSIsContainer} | foreach {
 #Получаем ширину и высоту изображения
 $image = $_.FullName | Get-Image
 $Width = $image.Width
 $Height = $image.Height
 #Вывод на экран 
 $pixels = $Width*$Height
 $hd_ready = 1280*720
 $string = $_.FullName+' Width:'+$Width+' Height:'+$Height + " Pixels:"+$pixels 
 $image.dispose()
 if ($pixels -le $hd_ready) {
 Remove-Item $_.FullName 
 write-host $string
 } 
 }
}

Копирование бекапов на резервную площадку

Если PowerShell скрипт запущен в определенное время и определенный день, то он начинает копировать файлы из указанных папок. Ход процесса записывается в лог файл.

После окончания работы:

  • присылается письмо в котором указано:
    • свободное место на локальных дисках (до старта и после окончания), объем бекапа
    • время старта и окончания, длительность бекапа
    • средняя скорость копирования
  • компьютер выключается

Компьютер выключается потому, что он в основном выключен. Для резервного копирования он автоматически включается (настройка в биосе).

$StartTimeHour = (Get-Date).Hour #Запоминаем когда запустилась задача
$Day_of_week = [int]((Get-Date).DayofWeek) #текущий день недели
if ((($Day_of_week -eq 2)-or($Day_of_week -eq 4)-or($Day_of_week -eq 6))-and($StartTimeHour -eq 11)) {
#старт копирования если сейчас вторник, среда, суббота и при этом 11 часов
 $StartTime = Get-Date -Format "yyyy.MM.dd HH:mm:ss" #время старта копирования 
 $Free_Space_Start = Get-WMIObject Win32_LogicalDisk -Filter "DeviceID='D:'" | ForEach-Object {[math]::truncate($_.freespace / 1GB)} #свободное место до бекапа
 $Free_Space_Start_Bytes = Get-WMIObject Win32_LogicalDisk -Filter "DeviceID='D:'" | ForEach-Object {$_.freespace} #свободное место до бекапа
 $log_file = "D:\Backups\log.txt" #лог файл скрипта, можно понять на каком этапе работа скрипта
 $date = "{0:yyyy-MM-dd}" -f (get-date) #текущая дата для имени папки
 $path = "D:\Backups\" + $date + "\" #имя папки
 if (-not(Test-Path $path)) { #если папка не существует
 write-host "создаем папку: " + $path 
 $result = New-Item -ItemType directory -Path $path #создаем папку
 }
 #копируем резервные копии медка
 $time = "{0:yyyy-MM-dd HH:mm:ss}" -f (get-date)
 $string = $time + " Start Copy \\172.16.13.1\Backups\Medoc"
 "##################################################" | Out-File -Append $log_file -Encoding UTF8
 $string | Out-File -Append $log_file -Encoding UTF8 
 & robocopy \\172.16.13.1\Backups\Medoc D:\Backups\Medoc /e /log:"D:\Backups\robocopy_log.txt"
 #копируем резервные копии разных устройств и ПО
 $time = "{0:yyyy-MM-dd HH:mm:ss}" -f (get-date)
 $string = $time + " Start Copy \\172.16.13.1\Backups\Other"
 $string | Out-File -Append $log_file -Encoding UTF8
 & robocopy \\172.16.13.1\Backups\Other D:\Backups\Other /e /log:"D:\Backups\robocopy_log.txt"
 #копируем резервные копии Windows с 1-го сервера
 $path = $path + "WindowsImageBackup"
 $time = "{0:yyyy-MM-dd HH:mm:ss}" -f (get-date)
 $string = $time + " Start Copy \\172.16.13.1\Backups\WindowsImageBackup"
 $string | Out-File -Append $log_file -Encoding UTF8
 & robocopy \\172.16.13.1\Backups\WindowsImageBackup $path /e /log:"D:\Backups\robocopy_log.txt"
 #копируем резервные копии Windows с 2-го сервера
 $time = "{0:yyyy-MM-dd HH:mm:ss}" -f (get-date)
 $string = $time + " Start Copy \\172.16.13.2\Backups\WindowsImageBackup"
 $string | Out-File -Append $log_file -Encoding UTF8
 & robocopy \\172.16.13.2\Backups\WindowsImageBackup $path /e /log:"D:\Backups\robocopy_log.txt"
 #запись в лог-файл окончания работы
 $time = "{0:yyyy-MM-dd HH:mm:ss}" -f (get-date)
 $string = $time + " Finish Backup"
 $string | Out-File -Append $log_file -Encoding UTF8
 "##################################################" | Out-File -Append $log_file -Encoding UTF8
 #Формируем данные для письма
 $EndTime = Get-Date -Format "yyyy.MM.dd HH:mm:ss"
 $Free_Space_End = Get-WMIObject Win32_LogicalDisk -Filter "DeviceID='D:'" | ForEach-Object {[math]::truncate($_.freespace / 1GB)} #свободное место после бекапа
 $Free_Space_End_Bytes = Get-WMIObject Win32_LogicalDisk -Filter "DeviceID='D:'" | ForEach-Object {$_.freespace} #свободное место до бекапа 
 $backup_Size = $Free_Space_Start-$Free_Space_End
 $backup_Size_Bytes = $Free_Space_Start_Bytes-$Free_Space_End_Bytes
 $Work_time = $(NEW-TIMESPAN –Start $StartTime –End $EndTime)
 $Work_time_seconds = $Work_time.TotalSeconds
 $NetworkSpeed = '{0:N1}' -f ((($backup_Size_Bytes / $Work_time_seconds) / (1024*1024)) * 8)
 $Mail_String = "Свободное место до бекапа: " + $Free_Space_Start + " ГБ | `r`n"
 $Mail_String = $Mail_String + "Свободное место после бекапа:" + $Free_Space_End + " ГБ | `r`n"
 $Mail_String = $Mail_String + "Размер бекапа: " + $backup_Size + " ГБ | `r`n"
 $Mail_String = $Mail_String + "Старт бекапа: " + $StartTime + " | `r`n"
 $Mail_String = $Mail_String + "Конец бекапа: " + $EndTime + " | `r`n"
 $Mail_String = $Mail_String + "Время выполнения: " + $Work_time + " | `r`n"
 $Mail_String = $Mail_String + "Средняя скорость копирования: " + $NetworkSpeed + " Мбит в секунду `r`n" 
 Write-host $Mail_String 
 #Заголовки письма и данные почтового ящика
 $From = "admin-notify@домен.com.ua"
 $To = "admin@домен.ком.ua"
 $SMTPServer = "адрес.сервера.com.ua"
 $SMTPPort = "25"
 $Username = "admin-notify@домен.ком.ua"
 $Password = "тут_пароль"
 $subject = "Copy Backups to ReserveServer" 
 $body = $Mail_String 
 #формируем сообщение в формате html:
 $message = New-Object System.Net.Mail.MailMessage $From, $To
 $message.Subject = $subject
 $message.IsBodyHTML = $true
 $message.Body = $body
 #Отправляем:
 Write-host "Отправляем письмо"
 $smtp = New-Object System.Net.Mail.SmtpClient($SMTPServer, $SMTPPort)
 $smtp.EnableSSL = $true
 $smtp.Credentials = New-Object System.Net.NetworkCredential($Username, $Password)
 $smtp.Send($message)
 Write-host "Письмо отправленно"
 & shutdown -s -t 300 #выключаем компьютер через 5 минут
}

Информация об обновлениях WSUS

Этот Powershell скрипт получает информацию со WSUS и показывает:

  • количество обновлений по заданных критериям
  • краткую сводную информацию об обновлениях
  • имена обновлений
  • отображает список обновлений по заданным критериям для каждого компьютера по отдельности
$WSUSServer = 'SERVER_NAME' #WSUS-сервер
$PortNumber = 8530 #http порт wsus
[void][reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration")
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::getUpdateServer($WSUSServer,$False,$PortNumber)
$UpdateScope = New-Object Microsoft.UpdateServices.Administration.UpdateScope
#$UpdateScope.ApprovedStates = 'NotApproved' #указываем критерии апдейтов: не одобренные
#$UpdateScope.IncludedInstallationStates = 'NotInstalled' #указываем критерии апдейтов: не проинсталированные
$UpdateScope.IncludedInstallationStates = 'Installed' #указываем критерии апдейтов: проинсталированные
$UpdateScope #просматриваем сформированные критерии апдейтов
$wsus.GetUpdateCount($updatescope) #получаем и выводим количество апдейтов
$wsus.GetUpdateStatus($updatescope,$False) #получаем и выводим краткую информацию об обновлениях
$wsus.GetUpdates($updatescope).Title #выводим имена апдейтов

$computers = $wsus.GetComputerTargets() #все компьютеры со wsus
ForEach ($computer in $computers){ #для каждого компьютера
 $Computername = $computer.fulldomainname #получаем его имя 
 $updates = $computer.GetUpdateInstallationInfoPerUpdate($updateScope) #получаем апдейты по указаным критериям
 $UpdateCount = $updates.Count #количество апдейтов для текущего компьютера
 write-host $Computername $UpdateCount #выводим имя компьютера и количество апдейтов
 $i = 0
 ForEach ($update in $updates) { #для каждого апдейта выводим подробную информацию 
 $i++
 $update_info = $update.GetUpdate() #запрашиваем инфо об апдейте
 $UpdateTitle = $update_info.Title #имя апдейта
 $IsApproved = $update_info.IsApproved #является ли он одобренным 
 write-host $Computername $i "of" $UpdateCount $IsApproved $UpdateTitle 
 }
}

Лочим экран и произносим текст

Задача: если в заббиксе сработал тригер и он не потвержден, то необходимо лочить экран и произность этот тригер.

Тригеры из заббикса запрашиваются утилитой zabbixctl и выводяться в текстовый файл, который опубликован по веб-адресу.

Сам powershell скрипт:

Add-Type -AssemblyName System.speech
$speak = New-Object System.Speech.Synthesis.SpeechSynthesizer
$request = (New-Object System.Net.WebClient).DownloadString("http://server/status.txt") #получаем тригеры
$speak.Rate = -2 #Замедляем скорость произношения
$zabbix_message = ($request -split '\n')[0] #первая строка - первый тригер
if ($zabbix_message.length -ge 1) { #если строка не пустая
 cmd /c rundll32.exe user32.dll,LockWorkStation #лочим экран
 $speak.Speak("zabbix. " + $zabbix_message) #произносим текст
 $Time = Get-Date -Format "yyyy.MM.dd HH:mm:ss" 
 $log_message = $Time + " " + $zabbix_message
 $log_message | Out-File -Append "c:\WINDOWS\scripts\log.txt" -Encoding UTF8 #записываем в лог-файл
}

Вывод размера какой-либо веб страницы

$web = New-Object System.Net.WebClient
"{0} bytes" -f ($web.DownloadString("https://elims.org.ua/")).length.toString("###,###,##0")

Остальные Powershell-скрипты:

Понравилось? =) Поделись с друзьями:

Эй, сценарист! Как я могу подписать сценарии Windows PowerShell с корпоративной PKI Windows? (Часть 2 из 2)

Привет, сценарист! Дадите ли вы нам последние шаги в пошаговом руководстве о том, как использовать существующую установку Windows PKI для подписи сценариев Windows PowerShell, или вы вчера просто пошутили?

–HR

Здравствуйте, HR,

Microsoft Scripting Guy Ed Wilson здесь.Как мы и обещали вчера, сегодня мы продолжим последние шаги, связанные с Windows PKI для подписи сценариев. Возвращаемся к Рагнару Харперу.

Шаг 3. Подпишите мой скрипт Windows PowerShell и запустите его.

На этом шаге мы будем внутри Windows PowerShell и подпишем наш скрипт. Для этого у меня есть простой скрипт с именем demoscript.ps1.

$ yourName = Read-Host «Как вас зовут?»

Write-Host «Hello $ yourName»

Напоминаем, что ваши требования к подписанным сценариям устанавливаются с помощью командлета Set-ExecutionPolicy (или групповой политики).

Настройка

Описание

Без ограничений

Нет требований; разрешены все сценарии

RemoteSigned

Разрешены все локальные сценарии; только подписанные удаленные скрипты

AllSigned

Все скрипты должны быть подписаны

Запрещено

Скрипты не разрешены

Для этой демонстрации моя политика выполнения установлено значение AllSigned .Если я просто попытаюсь запустить свой сценарий, он потерпит неудачу, как показано на следующем изображении.

Мы будем использовать командлет Set-AuthenticodeSignature для подписи скрипта. Я начну хранить сертификат подписи кода в переменной с именем $ cert .

$ cert = (dir cert: currentuser \ my \ -CodeSigningCert)

Тогда я готов подписать свой скрипт с помощью командлета Set-AuthenticodeSignature . Это показано на следующем изображении.

Как видите, статус действительный, значит, подпись прошла успешно.Обратите внимание, что я рекомендую вам указать параметр TimeStampServer . Это обеспечит работу сценария, даже если срок действия подписанного сертификата истек. Он сообщит системе, что сертификат подписи кода был действителен на момент подписания. (Хорошо, я могу представить, что в некоторых ситуациях это может быть неверно, но я также думаю, что для большинства из нас этого будет достаточно.) Если вы не используете параметр TimeStampServer , скрипт перестанет работать, когда срок действия сертификата, используемого для подписи, истекает.Есть несколько источников для отметок времени. Используйте тот, который вам подходит.

Давайте попробуем снова запустить сценарии и посмотрим, что произойдет. Результаты показаны на следующем изображении.

У нас возникает вопрос, хотим ли мы запускать скрипт или нет. В вопросе написано, что это скрипт от ненадежного издателя. На шаге 4 я покажу вам, как сделать издателя (сертификат подписи кода) доверенным для вашего домена.

Что касается этого компьютера, теперь вы можете сделать этого издателя доверенным, выбрав A для Всегда запускать .Если вы выберете V для Никогда не запускать , вы явно сделаете этот издатель ненадежным, и скрипты, подписанные этим сертификатом, не будут выполняться.

Давайте остановимся и посмотрим, что именно здесь происходит. Если вы сделаете какой-либо выбор постоянным (например, Всегда запускать или Никогда не запускать ), сертификат подписи кода сохраняется на вашем компьютере как надежный или ненадежный издатель. Вы можете увидеть это через графический интерфейс, если вы откроете mmc.exe и загрузите оснастку Certificates, как показано на следующем изображении.

Или вы также можете сделать это из Windows PowerShell:

dir cert: \ CurrentUser \ TrustedPublisher

dir cert: \ CurrentUser \ Disallowed

Как вы увидите на шаге 4, вы также можете управлять этим параметром с помощью Групповая политика. На данный момент вы можете просто щелкнуть Run Once , и скрипту будет разрешено выполнение. Если вы откроете скрипт, вы увидите, что подпись прикреплена внизу.

Вы также можете использовать проверку подписи с помощью командлета Get-Authenticode .

На этом этапе я показал вам, как подписать сценарий Windows PowerShell, а также как сделать его надежным или ненадежным на вашем компьютере. На следующем шаге мы сделаем сертификат подписи кода доверенным в нашем домене с помощью групповой политики.

Шаг 4. Сделайте сертификат подписи кода доверенным в моем домене

Если бы вы развернули его в своем домене, вы, вероятно, использовали бы групповую политику, чтобы убедиться, что используемый сертификат подписи кода является доверенным издателем.Для этого есть два шага:

1. Экспортируйте сертификат подписи кода.

2. Создайте политику и импортируйте сертификат подписи кода в доверенные издатели.

Экспорт сертификата подписи кода

Начнем с экспорта сертификата подписи кода с клиентского компьютера, на котором мы запросили сертификат.

Запустите оснастку «Сертификаты», как показано на шаге 2 вчера. Откройте узел Personal , а затем Certificates .На панели содержимого вы увидите свой сертификат. (Тот, у которого Intended Purpose установлен на Code Signing ). Щелкните сертификат правой кнопкой мыши, выберите Все задачи , а затем щелкните Экспорт . Вы можете увидеть это на следующем изображении.

Щелкните Далее в каждом из трех диалоговых окон, которые вы видите. Убедитесь, что вы сохранили сертификат где-нибудь, чтобы получить к нему доступ с компьютера, на котором вы собираетесь запускать управление групповой политикой.Нет никакого риска для безопасности, делая общедоступную часть этого сертификата доступной, поэтому вы можете хранить ее где угодно.

На этом завершается экспортная часть из клиента. Теперь нам нужно открыть консоль управления групповой политикой. Это часть инструментов администрирования сервера, и обычно ее можно найти, если вы установили RSAT (инструменты удаленного администрирования сервера) на своем клиенте или на контроллере домена. Для этой демонстрации я запущу это с одного из своих контроллеров домена.

Создайте политику и импортируйте сертификат подписи кода в доверенных издателей

Когда я открываю консоль управления групповой политикой, я начинаю с создания новой политики. Я открываю свой домен ( harper.labs ), щелкаю его правой кнопкой мыши и выбираю . Выберите «Создать объект групповой политики в этом домене» и свяжите его здесь .

Убедитесь, что вы создали этот объект групповой политики (GPO) там, где вы хотите, в вашем собственном домене. Для этой демонстрации я создаю его на уровне домена.Я даю политике имя Certificates Policy и нажимаю OK .

Выберите политику ( Политика сертификатов ) на панели навигации, щелкните ее правой кнопкой мыши и выберите Изменить , как показано на следующем изображении.

Дождитесь запуска редактора групповой политики, затем щелкните Конфигурация компьютера , щелкните Политики , щелкните Параметры Windows , а затем щелкните Политики открытого ключа .Теперь вы готовы начать импорт. Щелкните правой кнопкой мыши Trusted Publishers , а затем щелкните Import .

В диалоговом окне с запросом сертификата для импорта выберите сертификат, который вы экспортировали ранее. Затем нажмите Далее .

Как показано на следующем изображении, убедитесь, что сертификат помещен в хранилище доверенных издателей, и нажмите Далее .

Теперь завершите работу мастера, нажав Готово .Вы импортировали сертификат как надежный издатель, как показано на следующем изображении.

Вы можете убедиться в этом, заглянув в узел «Надежные издатели» в редакторе групповой политики, как показано на следующем изображении.

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

Я протестирую это на своем клиентском компьютере. Сначала я проверю, нет ли сертификата в моем списке доверенных издателей. Это должно быть сделано через оснастку «Сертификаты» на моем клиенте.

Затем я запускаю gpupdate / force из окна Windows PowerShell. Результаты показаны на следующем изображении.

После успешного завершения обновления я обновляю список надежных издателей в оснастке «Сертификаты».Теперь мой сертификат должен быть указан как надежный, как показано на следующем изображении.

Надеюсь, это поможет, и получайте удовольствие от Windows PowerShell!

HR, вот и все, что нужно для использования Windows PKI для подписи сценариев Windows PowerShell. На этом Неделя гостевых блоггеров подошла к концу. Свяжитесь с нами завтра, когда мы углубимся в виртуальный почтовый ящик для Quick-Hits Friday.

Если вы хотите точно знать, на что мы будем смотреть завтра, подпишитесь на нас в Twitter или Facebook.Если у вас есть какие-либо вопросы, отправьте нам электронное письмо по адресу [email protected] или разместите их на официальном форуме разработчиков сценариев. До завтра. А пока мир.


Эд Уилсон и Крейг Либендорфер, сценаристы

.

Запуск сценариев PowerShell из удаленного файлового ресурса

Dr Scripto

Резюме : Разработчик сценариев Microsoft, Эд Уилсон, рассказывает о запуске сценариев Windows PowerShell из удаленного файлового ресурса.

Разработчик сценариев Microsoft, Эд Уилсон, здесь. Это своего рода официальный…

Впереди как минимум три субботних мероприятия по Windows PowerShell. Они перечислены на субботнем веб-сайте PowerShell. Атланта и Сингапур уже планируют (я знаю, потому что буду выступать на обоих мероприятиях).Мероприятие в Шарлотте все еще находится на ранней стадии планирования (я тоже буду там выступать). Конечно, не верьте мне на слово. Добавьте в закладки веб-сайт PowerShellSaturday, чтобы быть в курсе всех событий.

Вначале о главном

Примечание Чтобы получить хорошую справочную информацию о запуске сценариев Windows PowerShell из удаленного файлового ресурса, ознакомьтесь с сообщением в гостевом блоге, написанным Джун Блендер и Джудит Херман: Как запускать сценарии PowerShell из общего каталога .

Итак, у меня есть эта общая папка на одном из моих серверов. Я могу открыть Windows PowerShell и использовать команду Net View , чтобы увидеть все общие ресурсы. Затем я могу использовать команду Get-ChildItem ( dir — псевдоним) для просмотра файлов в общей папке. Это показано здесь.

Если я хочу просмотреть файлы в графическом интерфейсе, я могу ввести путь в Internet Explorer и просмотреть файлы в проводнике, как показано на следующем изображении.

В качестве фона я знаю, что удаленный сервер работает под управлением 32-разрядной Windows Server 2008. Я также обнаружил, что на сервере работает Windows PowerShell 2.0. Я сделал это с помощью командлета Invoke-Command ( icm — псевдоним), как показано здесь:

PS C: \> icm -ComputerName dc1 {$ PSVersionTable}

Имя Значение

—- —–

PSRemotingProtocolVersion 2.1

BuildVersion 6.0.6002.18111

PSCompatibleVersions {1.0, 2.0}

PSVersion 2.0

CLRVersion 2.0.50727.4241

WSManStackVersion 2.0

Сценарий IOS2 900.0 Open, который можно использовать в ISS

Сценарий для

Сериализации

Сценарий

Open IS

Сценарий

Сериализация

открыть сценарий Windows PowerShell в Windows PowerShell ISE на моем 64-разрядном ноутбуке (под управлением Windows 8a и Windows PowerShell 3.0) из удаленного файлового ресурса. Итак, я делаю следующее:

  • Я открываю Windows PowerShell ISE.
  • Я нажимаю Файл , затем Открыть .
  • В диалоговом окне Открыть я ввожу UNC-путь к удаленному файловому ресурсу и нажимаю ENTER. Сейчас я просматриваю файлы из общего ресурса, как показано на следующем изображении.

Я просматриваю (и при необходимости редактирую) сценарий из удаленного файлового ресурса. Когда я готов, я щелкаю зеленый треугольник (или нажимаю F5), чтобы запустить сценарий.В верхней части панели вывода я вижу UNC-расположение сценария. В следующих строках я вижу результат.

Имейте в виду, что сценарий находится в удаленном файловом ресурсе, но выполнение сценария происходит на моем локальном компьютере, а вывод, который отображается, относится к моему локальному компьютеру. Например, удаленный сервер — это устройство Dell, а мой локальный ноутбук — устройство Lenovo. Удаленный сервер называется DC1, но мой локальный ноутбук называется EDLT. Сценарий и выходные данные сценария показаны здесь.

Запускать непосредственно в консоли Windows PowerShell

Но мне не нужно открывать сценарий в Windows PowerShell ISE; вместо этого я могу запустить его прямо из консоли Windows PowerShell. Это можно сделать двумя способами: использовать точечный источник сценария или использовать оператор Invocation .

PS C: \>. \\ dc1 \ share \ ServerNameBios.ps1

PS C: \> & \\ dc1 \ share \ ServerNameBios.ps1

Команды и выходные данные команд показаны на следующем изображении.

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

Я приглашаю вас подписаться на меня в Twitter и Facebook. Если у вас есть какие-либо вопросы, отправьте мне письмо по адресу [email protected] или разместите свои вопросы на официальном форуме разработчиков сценариев. До завтра. А пока мир.

Эд Уилсон, Microsoft Scripting Guy

Dr Scripto

Scripter, PowerShell, vbScript, BAT, CMD

.

Запуск сценариев PowerShell, хранящихся на центральном файловом ресурсе

Обзор: Узнайте о политиках выполнения сценариев Windows PowerShell и о том, как они влияют на выполнение сценариев из центрального файлового ресурса.

Привет, сценарист! Мне любопытно, где лучше всего хранить скрипты. Я хочу вести общий список одобренных сценариев, но не уверен, как это сделать лучше всего. Мне интересно, подойдет ли для моих целей простой файловый ресурс внутри сети.Как вы думаете? Будет ли общий файловый ресурс работать для обмена скриптами внутри сети?

— SG

Здравствуйте, SG, автор сценариев Microsoft Эд Уилсон. Когда на улице 31 градус по Фаренгейту (-0,5 градусов по Цельсию), жена-сценарист начинает ныть, что на улице холодно. Фактически, она прервала меня вчера вечером, когда я читал роман Дороти Сэйерс, который я взял в публичной библиотеке на выходных, чтобы «пойти посмотреть на снег». Увидеть наш снегопад прошлой ночью было своего рода уловкой.Сначала пришлось включить внешний свет. Затем я должен был встать в определенное положение и смотреть вверх на луну. Если бы я держал голову неподвижно, я мог бы увидеть несколько хлопьев, падающих на землю. Накопления не было. Фактически, я считаю, что хлопья были обречены превратиться в капли дождя, даже не коснувшись земли. Но увидеть снег было приятно.

Как бы то ни было, как я уже начал говорить, жена-сценарист начала ныть.

«Холодно. Смотрите, идет снег. Я хочу поехать на Гавайи », — сказала она.

«Я тоже хочу поехать на Гавайи, но мне нельзя летать», — ответил я.

«Так что я пойду одна, чтобы помочь в субботу SQL в Гонолулу», — пригрозила она.

Я поднял фотографию, которую сделал во время нашей последней поездки в Гонолулу, чтобы преподавать класс Windows PowerShell. Теплая вода, глубокое сапфирово-голубое небо и снежно-белые пляжи игриво выглядывают вдалеке за моим любимым деревом — пальмой. Эта идиллическая сцена представлена ​​на следующем рисунке.

«Хммм… — сказал я, — если я все еще не могу летать, когда наступает суббота SQL, почему бы вам не пойти вперед и не появиться там.Вы можете принести мне кофе Kona, коробку орехов макадамии в шоколаде и ананас Sugar Loaf ».

Говоря о приятных вещах, SG, вы действительно можете хранить свои скрипты в централизованном сетевом ресурсе. Фактически, я делаю именно это, потому что это обеспечивает быстрый доступ к сценариям, которые я использую для развертывания как клиента, так и сервера.

Конечно, доступ к сценариям из удаленного общего ресурса может вызвать проблемы с политикой выполнения сценария. Фактически, запуск скриптов сам по себе может иногда вызывать проблемы с политикой выполнения скриптов.Для получения дополнительной информации см. «Жена сценария устанавливает политику выполнения сценария» Эй, сценарист! Сообщение блога.

По умолчанию, когда установлена ​​Windows 7 или Windows PowerShell, для политики выполнения сценария установлено значение с ограниченным доступом . Командлет Windows PowerShell Get-ExecutionPolicy можно использовать для проверки настройки политики выполнения Windows PowerShell. Это видно здесь.

PS C: \> Get-ExecutionPolicy

Restricted

PS C: \>

Если для политики выполнения сценария установлено значение limited , сценарии Windows PowerShell запускаться не будут.Не имеет значения, находится ли сценарий на удаленном сервере в общем файловом ресурсе или сценарий находится в локальной папке. Это видно на следующем рисунке.

Если вы хотите запустить сценарий только из удаленного общего ресурса без изменения политики выполнения сценария по умолчанию, вы можете использовать переключатель bypass при запуске Windows PowerShell. Вы можете указать путь к сценарию с помощью параметра file . Это видно на следующем рисунке.

Вы также можете открыть консоль Windows PowerShell с установленной политикой обхода, используя следующую команду для запуска Windows PowerShell.

powershell -executionpolicy bypass

После того, как у вас есть консоль Windows PowerShell, работающая в режиме обхода для политики выполнения, вы можете запустить удаленный сценарий. Это видно здесь.

PS C: \ Users \ ed.NWTRADERS> \\ hyperv-box \ shared \ bios.ps1

SMBIOSBIOS Версия: A06

Производитель: Dell Inc.

Название: Phoenix ROM BIOS PLUS, версия 1.10 A06

Серийный номер: BDY91L1

Версия: DELL — 15

Чтобы изменить политику выполнения сценария Windows PowerShell, используйте командлет Windows PowerShell Set-ExecutionPolicy и укажите желаемый новый уровень.Эта команда должна быть запущена от имени администратора. В Windows Vista или более поздних версиях это означает, что щелкните правой кнопкой мыши консоль Windows PowerShell и выберите Запуск от имени администратора в меню действий. В более ранних версиях Windows это означает использование команды RunAs для запуска с другими учетными данными. Если вы попытаетесь использовать командлет Set-ExecutionPolicy без прав администратора, отобразится ошибка. Это видно на следующем рисунке.

В корпоративных настройках групповая политика должна использоваться для управления политикой выполнения сценария.

Интересно, что для запуска PowerShell в режиме обхода не требуются права администратора. Помните, что политика выполнения сценария не является функцией безопасности. Это удобная функция. В автомобиле ремень безопасности действительно защищает вас и, следовательно, является элементом безопасности. Звуковой сигнал, который вас раздражает, пока вы не пристегнете ремень безопасности, является удобной функцией (то есть на самом деле он вас не защищает). Поскольку Windows PowerShell — это просто приложение, такое как Microsoft Word или даже Solitaire, пользователь имеет право запускать и использовать Windows PowerShell.Если вы хотите ограничить доступ пользователей, вам следует использовать политики ограниченного использования программ. Но имейте в виду, что это помешает вам использовать Windows PowerShell для сценариев входа в систему и для многих других административных целей.

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

Set-ExecutionPolicy remotesigned

При настройке политики выполнения скрипта я обычно сначала смотрю, что это такое, затем устанавливаю политику, а затем снова проверяю, чтобы убедиться, что я правильно установил политику.Это видно на следующем рисунке.

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

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

Имейте в виду, что сначала нужно изучить сценарий, чтобы убедиться, что вы знаете, что он на самом деле делает! Кроме того, тестирование скриптов на виртуальной машине — отличная практика. Скрипты, скопированные из репозитория скриптов Scripting Guys, не будут заблокированы (на момент написания этой статьи), потому что вы фактически не загружаете скрипт.Вы копируете его в буфер обмена, а затем вставляете в редактор сценариев. Это заставляет Windows PowerShell думать, что сценарий был создан локально. Следовательно, он не будет заблокирован. Как и в случае с любым другим скриптом, вы также должны убедиться, что знаете, какие скрипты, загруженные из Scripting Guys Script Repository, тоже делают.

А как насчет сценариев, находящихся в общей папке в сети? На моем компьютере они работают нормально. Имейте в виду, что Windows PowerShell уважает зоны безопасности Internet Explorer.Следовательно, это зависит от того, в какой зоне безопасности находятся ваши серверы интрасети. Зоны безопасности Internet Explorer можно настроить с помощью групповой политики.

SG, вот и все, что нужно для использования общей папки для хранения скриптов Windows PowerShell. Неделя размещения скриптов продолжится завтра, когда я расскажу о модулях.

Я приглашаю вас подписаться на меня в Twitter или Facebook. Если у вас есть какие-либо вопросы, отправьте мне письмо по адресу [email protected] или разместите их на официальном форуме разработчиков сценариев.До завтра. А пока мир.

Эд Уилсон, Microsoft Scripting Guy

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *