Создание и изменение скриптов с помощью Windows PowerShell
В этой схеме обучения описано, как создавать и изменять скрипты. Здесь рассматриваются полезные методы создания скриптов, включая импорт данных из файла, принятие входных данных пользователем и обработку ошибок.
Предварительные требования
- Общее представление о сетевых технологиях Windows и принципах их реализации
- Общее представление о принципах администрирования, обслуживания и устранения неполадок с Windows Server
- Общее представление о принципах работы Windows PowerShell и командах для выполнения определенных задач
- Общее представление о командлетах PowerShell, которые используются для задач системного администрирования, связанных с Active Directory, конфигурацией сети, а также администрированием серверов и устройств Windows 10
- Общее представление о конвейере Windows PowerShell, поставщиках PowerShell и дисках PowerShell
- Общее представление о технологиях CIM и WMI
- Общее представление о принципах использования переменных, массивов и хэш-таблиц в Windows PowerShell
Создание скрипта WMI
Вы можете просматривать и управлять любой информацией, доступной через WMI, с помощью скриптов. Скрипты могут быть написаны на любом языке сценариев, поддерживающем размещение сценариев Microsoft ActiveX, включая Visual Basic Scripting Edition (VBScript), PowerShell и Perl. Узел сценариев Windows (WSH), страницы активных серверов и интернет-Обозреватель могут размещать сценарии WMI.
Основным языком сценариев, поддерживаемым инструментарием WMI, является PowerShell. Однако WMI также содержит надежную поддержку скриптов для VBScript и других языков, которые обращаются к API скриптов для WMI.
Языки сценариев WMI
Два языка main, поддерживаемые WMI, — это PowerShell и VBScript (через узел сценариев Windows или WSH).
- PowerShell был разработан с учетом тесной интеграции с инструментарием WMI. Таким образом, большинство базовых элементов WMI встроены в командлеты WMI: Get-WmiObject, Set-WmiInstance, Invoke-WmiMethod и Remove-WmiObject. В следующей таблице описаны общие процессы, используемые для доступа к сведениям WMI. Обратите внимание, что в большинстве этих примеров используется Get-WMIObject, но многие командлеты WMI PowerShell имеют те же параметры, например -Class или -Credentials. Поэтому многие из этих процессов также работают и для других объектов. Более подробное описание PowerShell и WMI см. в разделах Использование командлета Get-WMiObject и Windows PowerShell — WMI-подключение.
- VBScript, напротив, явно выполняет вызовы API скриптов для WMI, как упоминалось выше. Другие языки, такие как Perl, также могут использовать API сценариев для WMI. Однако для целей этой документации в большинстве примеров, демонстрирующих API скриптов для WMI, будет использоваться VBScript. Однако если метод программирования специфичен для VBScript, он будет вызываться. VBScript имеет два разных способа доступа к инструментарию WMI. Во-первых, для подключения к WMI используется объект SWbemLocator . Кроме того, можно использовать GetObject и моникер. Моникер — это строка, которая может описать ряд элементов: учетные данные, параметры олицетворения, компьютер, к которому требуется подключиться, пространство имен WMI (т. е. общее расположение, где WMI хранит группы объектов) и какой объект WMI требуется извлечь. Во многих приведенных ниже примерах описаны оба метода. Дополнительные сведения см. в разделах Создание строки моникера и Описание расположения объекта WMI. Независимо от того, какой метод используется для подключения к WMI, вы, скорее всего, получите один или несколько объектов из API скриптов. Наиболее распространенным является SWbemObject, который WMI использует для описания объекта WMI. Кроме того, можно использовать объект SWbemServices для описания самой службы WMI или объект SWbemObjectPath для описания расположения объекта WMI. Дополнительные сведения см. в разделах Создание скриптов с помощью SWbemObject и Создание скриптов вспомогательных объектов.
Использование инструментария WMI и языка сценариев, как это сделать.
. подключиться к WMI?
Для VBScript и API скриптов для WMI получите объект SWbemServices с моникером и вызовом GetObject. Кроме того, можно подключиться к серверу с помощью вызова SWbemLocator.ConnectServer. Затем можно использовать объект для доступа к определенному пространству имен WMI или экземпляру класса WMI.
Для PowerShell подключение к WMI обычно выполняется непосредственно в вызове командлета; поэтому никаких дополнительных действий не требуется.
Set objLocator = CreateObject("WbemScripting.SWbemLocator") Set objService = objLocator.ConnectServer(".", "root\cimv2") ' Second example: implicitly uses the local compuer (.) and default namespace ("root\cimv2") Set objWMIService = GetObject("winmgmts:")
#Already has all the defaults set get-WmiObject Win32_LogicalDisk #Or, to be explicit, get-WmiObject -class Win32_LogicalDisk -Computer "." -Namespace "root\cimv2" -Impersonation Impersonate
. получить сведения из инструментария WMI?
Для VBScript и API скриптов для WMI используйте функцию извлечения, например WbemServices.Get или WbemServices.InstancesOf. Вы также можете поместить имя класса объекта для извлечения в моникер, что может быть более эффективным.
Для PowerShell используйте параметр -Class . Обратите внимание, что параметром по умолчанию является -Class; Таким образом, вам не нужно явно указать его.
Set objLocator = CreateObject("WbemScripting.SWbemLocator") Set objService = objLocator.ConnectServer(".", "root\cimv2") Set colScheduledJobs = objService.InstancesOf("Win32_ScheduledJob") ' Second example SSet Service = GetObject("WinMgmts:!Win32_Service=""ALERTER""")
#default - you don't actually need to use the -Class parameter Get-WMIObject Win32_WmiSetting #but you can if you want to Get-WMIObject -Class Win32_WmiSetting
. создать запрос WMI?
Для VBScript и API скриптов для WMI используйте метод SWbemServices.ExecQuery .
Для PowerShell используйте параметр -Query . Вы также можете выполнить фильтрацию с помощью параметра -Filter .
Дополнительные сведения см. в разделе Запрос WMI.
strComputer = "." Set objWMIService = GetObject("winmgmts:!\\" & strComputer & "\root\cimv2") Set colScheduledJobs = objWMIService.ExecQuery("Select * from Win32_ScheduledJob") For Each objJob in colScheduledJobs Wscript.Echo "Job ID: " & objJob.JobId & "Command: " & objJob.Command & VBNewLine
Get-WmiObject -query "SELECT * FROM Win32_logicalDisk WHERE DeviceID = 'C:'" #or get-wmiObject -Class Win32_LogicalDisk -Filter "DeviceID = 'C:'"
. перечислить через список объектов WMI?
Для VBScript и API скриптов для WMI используйте объект контейнера SWbemObjectSet , который рассматривается в скрипте как коллекция, которую можно перечислить. SWbemObjectSet можно получить из вызова из SWbemServices.InstancesOf или SWbemServices.ExecQuery.
PowerShell может получать и обрабатывать перечисления так же, как и любой другой объект; нет ничего особенно уникального для WMI.
Дополнительные сведения см. в разделе Доступ к коллекции.
For Each Disk In GetObject("winmgmts:").InstancesOf ("CIM_LogicalDevice")
$logicalDevices = Get-WmiObject CIM_LogicalDevice foreach ($device in $logicalDevices) < $device.name >#or, to be more compact Get-WmiObject cim_logicalDevice | ForEach-Object
. получить доступ к другому пространству имен WMI?
Для VBScript и API скриптов для WMI укажите пространство имен в моникере или вы можете явно указать пространство имен в вызове SwbemLocator.ConnectServer.
Для PowerShell используйте параметр -Namespace . Пространство имен по умолчанию — «root\cimV2»; однако многие старые классы хранятся в «root\default».
Чтобы найти расположение заданного класса WMI, просмотрите страницу справки. Кроме того, можно вручную изучить пространство имен с помощью get-WmiObject.
Set objLocator = CreateObject("WbemScripting.SWbemLocator") Set objService = objLocator.ConnectServer(".", "root\cimv2") ' Second example Set objWMIService = GetObject("winmgmts:!\\" & "." & "\root\cimv2")
Get-WmiObject -list * -Namespace root\default #or, to retrieve all namespaces, Get-WmiObject -Namespace root -Class __Namespace
. получить все дочерние экземпляры класса?
Для языков, которые напрямую используют API скриптов для WMI и PowerShell, WMI поддерживает получение дочерних классов базового класса. Таким образом, чтобы получить дочерние экземпляры, необходимо искать только родительский класс. В следующем примере выполняется поиск CIM_LogicalDisk, который представляет собой предустановленный класс WMI, представляющий логические диски в системе компьютера под управлением Windows. Таким образом, поиск этого родительского класса также возвращает экземпляры Win32_LogicalDisk, которые Windows использует для описания жестких дисков. Дополнительные сведения см. в разделе Common Information Model. WMI предоставляет всю схему таких предустановленных классов, которые позволяют получать доступ к управляемым объектам и управлять ими. Дополнительные сведения см. в разделе Классы Win32 и классы WMI.
For Each Disk In GetObject("winmgmts:").InstancesOf ("CIM_LogicalDisk") WScript.Echo "Instance:", Disk.Name
Get-WmiObject CIM_LogicalDisk | ForEach-Object
. найти объект WMI?
Для API скриптов для WMI и PowerShell WMI использует сочетание пространства имен, имени класса и ключевых свойств для уникальной идентификации данного экземпляра WMI. Вместе это называется путем к объекту WMI. Для VBScript свойство SWbemObject.Path_ описывает путь к любому объекту, возвращаемому API скриптов. Для PowerShell каждый объект WMI будет иметь свойство __PATH. Дополнительные сведения см. в разделе Описание расположения объекта WMI.
Помимо пространства имен и имени класса, объект WMI также будет иметь свойство key, которое однозначно идентифицирует этот экземпляр по сравнению с другими экземплярами на компьютере. Например, свойство DeviceID является ключевым свойством класса Win32_LogicalDisk . Дополнительные сведения см. в разделе Формат управляемого объекта (MOF).
Наконец, относительный путь является просто сокращенной формой пути и включает имя класса и значение ключа. В приведенных ниже примерах путь может быть «\\имя_компьютера\root\cimv2:Win32_LogicalDisk.DeviceID=»D:»», а относительный путь — «»Win32LogicalDisk.DeviceID=»D»».
For Each Disk In GetObject("winmgmts:").InstancesOf ("CIM_LogicalDisk") WScript.Echo "Instance:", Disk.Path_.Relpath 'or to get the path For Each Disk In GetObject("winmgmts:").InstancesOf ("CIM_LogicalDisk") WScript.Echo "Instance:", Disk.Path_
#retrieving the path Get-WmiObject CIM_LogicalDisk | ForEach-Object < "Instance: " + $_.__PATH >#retrieving the relative path Get-WmiObject CIM_LogicalDisk | ForEach-Object
. задать сведения в инструментарии WMI?
Для VBScript и API скриптов для WMI используйте метод SWbemObject.Put_ .
Для PowerShell можно использовать метод Put или Set-WmiInstance.
Дополнительные сведения см. в разделе Изменение свойства экземпляра.
wbemCimtypeString = 8 Set objSWbemService = GetObject("Winmgmts:root\default") Set objClass = objSWbemService.Get() objClass.Path_.Class = "NewClass" ' Add a property ' String property objClass.Properties_.add "PropertyName", wbemCimtypeString ' Make the property a key property objClass.Properties_("PropertyName").Qualifiers_.add "key", true ' Write the new class to the root\default namespace in the repository Set objClassPath = objClass.Put_ WScript.Echo objClassPath.Path 'Create an instance of the new class using SWbemObject.SpawnInstance Set objNewInst = GetObject("Winmgmts:root\default:NewClass").Spawninstance_ objNewInst.PropertyName = "My Instance" ' Write the instance into the repository Set objInstancePath = objNewInst.Put_ WScript.Echo objInstancePath.Path
$mySettings = get-WMIObject Win32_WmiSetting $mySettings.LoggingLevel = 1 $mySettings.Put() #or Set-WMIInstance -class Win32_WMISetting -argument @
. использовать разные учетные данные?
Для VBScript и API скриптов для WMI используйте параметры UserName и Password в методе SWbemLocator.ConnectServer .
Для PowerShell используйте параметр -Credential .
Обратите внимание, что в удаленной системе можно использовать только альтернативные учетные данные. Дополнительные сведения см. в разделе Защита клиентов сценариев.
strComputer = "remoteComputerName" strDomain = "DOMAIN" Wscript.StdOut.Write "Please enter your user name:" strUser = Wscript.StdIn.ReadLine Set objPassword = CreateObject("ScriptPW.Password") Wscript.StdOut.Write "Please enter your password:" strPassword = objPassword.GetPassword() Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator") Set objSWbemServices = objSWbemLocator.ConnectServer(strComputer, _ "Root\CIMv2", _ strUser, _ strPassword, _ "MS_409", _ "ntlmdomain:" + strDomain) Set colSwbemObjectSet = objSWbemServices.ExecQuery("Select * From Win32_Process") For Each objProcess in colSWbemObjectSet Wscript.Echo "Process Name: " & objProcess.Name Next
$Computer = "atl-dc-01" Get-WmiObject -Namespace "root\cimv2" -Class Win32_Process -Credential FABRIKAM\administrator ` -ComputerName $Computer
. получить доступ к удаленному компьютеру?
Для VBScript и API скриптов для WMI явно укажите имя компьютера в моникере или в вызове SWbemLocator.ConnectServer. Дополнительные сведения см. в статье Удаленное подключение к WMI с помощью VBScript.
Для PowerShell используйте параметр -ComputerName . Дополнительные сведения см. в статье Удаленное подключение к WMI с помощью PowerShell.
Set objLocator = CreateObject("WbemScripting.SWbemLocator") Set objService = objLocator.ConnectServer("myRemoteServerName", "root\cimv2") Set colScheduledJobs = objService.ExecQuery("SELECT * FROM Win32_ScheduledJob") For Each objJob in colScheduledJobs Wscript.Echo "Job ID: " & objJob.JobId & "Command: " & objJob.Command & VBNewLine 'example 2 strComputer = "myRemoteServerName" Set objWMIService = GetObject("winmgmts:!\\" & strComputer & "\root\cimv2") Set colScheduledJobs = objWMIService.ExecQuery("Select * from Win32_ScheduledJob") For Each objJob in colScheduledJobs Wscript.Echo "Job ID: " & objJob.JobId & "Command: " & objJob.Command & VBNewLine
$Computer = "atl-dc-01" Get-WmiObject -Namespace "root\cimv2" -Class Win32_logicalDisk -ComputerName $Computer
. задать уровни проверки подлинности и олицетворения?
Для VBScript и API скриптов для WMI используйте свойство SWbemServices.Security_ возвращенного объекта сервера или задайте соответствующие значения в моникере.
Для PowerShell используйте параметры -Authentication и -Impersonation соответственно. Дополнительные сведения см. в разделе Защита клиентов сценариев.
Дополнительные сведения см. в разделе Защита клиентов сценариев.
' First example Set Service = GetObject("WinMgmts:!Win32_Service=""ALERTER""") ' Second example Set Locator = CreateObject("WbemScripting.SWbemLocator") Set Service = Locator.ConnectServer service.Security_.ImpersonationLevel = wbemImpersonationLevelImpersonate Set objinstance = Service.Get("Win32_Service=""ALERTER""")
$Computer = "atl-dc-01" Get-WmiObject -Namespace "root\cimv2" -Class Win32_Process -Impersonation Impersonate ` -Authentication PacketIntegrity -Credential FABRIKAM\administrator -ComputerName $Computer
. обрабатывать ошибки в инструментарии WMI?
Для API скриптов для WMI поставщик может предоставить объект SWbemLastError , чтобы предоставить дополнительные сведения об ошибке.
В частности, в VBScript обработка ошибок также поддерживается с помощью собственного объекта Err . Вы также можете получить доступ к объекту SWbemLastError, как описано выше. Дополнительные сведения см. в разделе Извлечение кода ошибки.
Для PowerShell можно использовать стандартные методы обработки ошибок PowerShell. Дополнительные сведения см. в статье Введение в обработку ошибок в PowerShell.
'using Err On Error Resume Next Set objProcess = GetObject("winmgmts:root\cimv2:Win32_Process.Handle='one'") Wscript.Echo Err.Number 'using SWbemLastError On Error Resume Next Set obj = GetObject("winmgmts:root\cimv2:Win32_Process.Handle='one'") Set LastError = createobject("wbemscripting.swbemlasterror") Wscript.Echo "Operation = " & LastError.operation & VBCRLF & "ParameterInfo = " _ & LastError.ParameterInfo & VBCRLF & "ProviderName = " & LastError.ProviderName
Скрипт настройки Windows 10. Часть II

Чуть больше года назад выкладывал свой скрипт по автоматизации настройки Windows 10. Давеча переписал Windows 10 Sophia Script в виде примитивного модуля на 11 000+ строк для одноразового использования.

Основные претензии к предыдущей версии были три:
- Никто не хотел лезть в 3 500 строк кода и комментировать тот или иной раздел, чтобы он в дальнейшем не выполнялся;
- Если необходимо было откатиться на значение по умолчанию, никто не мог разобраться, что именно надо делать.
- Невозможно было перевести команды на другой язык без правки кода. Начиная с версии 5.1, файлы локализации вынесены в отдельные файлы, что облегчит процесс перевода.
Теперь скрипт состоит из 2 файлов: непосредственно модуль и файл пресета к нему, не считая файлов локализации. Модуль разбит примерно на 270 функций: как для внесения изменений, так и его «отката».
Теперь можно открыть файл пресета, где будет список из всех имеющихся функций (с подробным описанием каждой), и закомментировать строку с функций с помощью знака # , чтобы эта функция не выполнялась, или, наоборот, убрать знак # перед ней, чтобы функция выполнялась. Повторюсь: практически на каждую функцию есть функция на возврат в состояние по умолчанию, как «из коробки».
Поддерживаемые версии
Windows 10 Sophia Script поддерживает только актуальные версии Windows 10
Создание и запуск сценариев PowerShell из консоли Configuration Manager
Configuration Manager имеет встроенную возможность запуска сценариев PowerShell. Преимущество PowerShell состоит в создании сложных автоматизированных скриптов, понятных и предоставляемых более широкому сообществу. Скрипты упрощают создание пользовательских средств для администрирования программного обеспечения и позволяют быстро выполнять обычные задачи, что упрощает и более согласованное выполнение больших заданий.
В версии 2006 и более ранних Configuration Manager не включает эту необязательную функцию по умолчанию. Перед ее использованием необходимо включить эту функцию. Дополнительные сведения см. в разделе Включение дополнительных функций из обновлений.
Благодаря этой интеграции в Configuration Manager вы можете использовать функцию Запуска скриптов для выполнения следующих действий:
- Создание и изменение скриптов для использования с Configuration Manager.
- Управление использованием скриптов с помощью ролей и областей безопасности.
- Выполнение скриптов на коллекциях или отдельных локальных управляемых компьютерах с Windows.
- Планирование среды выполнения скриптов в формате UTC на коллекциях или отдельных локальных управляемых компьютерах с Windows.
- Получение быстрых агрегированных результатов скрипта с клиентских устройств.
- Мониторинг выполнения скрипта и просмотр результатов отчетов из выходных данных скрипта.
- Учитывая возможности скриптов, мы напоминаем вам, что вы должны быть преднамеренными и осторожными с их использованием. Мы встроили дополнительные меры безопасности, чтобы помочь вам; разделенные роли и области. Обязательно проверьте точность скриптов перед их выполнением и убедитесь, что они из надежного источника, чтобы предотвратить непреднамеренное выполнение скриптов. Помните о расширенных символах или другом запутывании и узнайте о защите скриптов. Дополнительные сведения о безопасности сценариев PowerShell
- Некоторые антивредоносные программы могут непреднамеренно активировать события для Configuration Manager запуска скриптов или функций CMPivot. Рекомендуется исключить %windir%\CCM\ScriptStore, чтобы программное обеспечение для защиты от вредоносных программ позволяло выполнять эти функции без вмешательства.
Предварительные требования
- Для запуска сценариев PowerShell на клиенте должна быть запущена оболочка PowerShell версии 3.0 или более поздней. Однако если выполняемый скрипт содержит функциональные возможности из более поздней версии PowerShell, клиент, на котором выполняется скрипт, должен работать с этой версией PowerShell.
- Configuration Manager клиенты должны запускать клиент из выпуска 1706 или более поздней версии, чтобы выполнять скрипты.
- Чтобы использовать сценарии, необходимо быть членом соответствующей роли безопасности Configuration Manager.
- Для импорта и создания скриптов ваша учетная запись должна иметь разрешения на созданиескриптов SMS.
- Чтобы утвердить или отклонить скрипты. Ваша учетная запись должна иметь разрешения на утверждениескриптов SMS.
- Для выполнения скриптов ваша учетная запись должна иметь разрешения на выполнение скрипта для коллекций.
Ограничения
Запуск скриптов в настоящее время поддерживает:
- Языки сценариев: PowerShell
- Типы параметров: целое число, строка и список.
Имейте в виду, что при использовании параметров открывается поверхность для потенциального риска атаки путем внедрения PowerShell. Существуют различные способы устранения рисков и обхода, например использование регулярных выражений для проверки входных параметров или использование предопределенных параметров. Рекомендуется не включать секреты в скрипты PowerShell (без паролей и т. д.). Дополнительные сведения о безопасности сценариев PowerShell
Запуск авторов и утверждающих скриптов
При выполнении скриптов используется концепция авторов скриптов и утверждающих скриптов в качестве отдельных ролей для реализации и выполнения скрипта. Разделение ролей автора и утверждающего обеспечивает важный процесс проверка для мощного средства запуска скриптов. Существует дополнительная роль средств выполнения скриптов , которая позволяет выполнять скрипты, но не создавать или утверждать скрипты. См . статью Создание ролей безопасности для сценариев.
Управление ролями скриптов
По умолчанию пользователи не могут утвердить сценарий, который они создали. Так как скрипты являются мощными, универсальными и могут развертываться на многих устройствах, можно разделить роли между человеком, создающим скрипт, и пользователем, утверждающим скрипт. Эти роли предоставляют дополнительный уровень безопасности при выполнении скрипта без надзора. Вы можете отключить вторичное утверждение, чтобы упростить тестирование.
Утверждение или отклонение скрипта
Скрипты должны быть утверждены ролью утверждающего скрипта , прежде чем они могут быть запущены. Чтобы утвердить скрипт, выполните приведенные ниже действия.

- В консоли Configuration Manager щелкните Библиотека программного обеспечения.
- В рабочей области Библиотека программного обеспечения щелкните Скрипты.
- В списке Скрипт выберите сценарий, который требуется утвердить или отклонить, а затем на вкладке Главная в группе Скрипт нажмите кнопку Утвердить или отклонить.
- В диалоговом окне Утверждение или отклонение скрипта выберите Утвердить или Запретить для скрипта. При необходимости введите комментарий о своем решении. Если вы отклоните скрипт, его нельзя будет запустить на клиентских устройствах.
- Завершите работу мастера. В списке Скрипт столбец Состояние утверждения изменится в зависимости от выполняемого действия.
Разрешить пользователям утверждать собственные скрипты
Это утверждение в основном используется на этапе тестирования разработки скрипта.
- В консоли Configuration Manager щелкните Администрирование.
- В рабочей области Администрирование разверните узел Конфигурация сайта, а затем щелкните Сайты.
- В списке сайтов выберите свой сайт, а затем на вкладке Главная в группе Сайты щелкните Параметры иерархии.
- На вкладке Общие диалогового окна Свойства параметров иерархии снимите флажок Авторы скриптов требуют дополнительного утверждающего скрипта.
Рекомендуется не разрешать автору скриптов утверждать собственные скрипты. Это должно быть разрешено только в параметре лаборатории. Внимательно изучите возможные последствия изменения этого параметра в рабочей среде.
Области безопасности
При выполнении скриптов используются области безопасности, существующая функция Configuration Manager, для управления написанием и выполнением скриптов путем назначения тегов, представляющих группы пользователей. Дополнительные сведения об использовании областей безопасности см. в статье Настройка администрирования на основе ролей для Configuration Manager.
Создание ролей безопасности для сценариев
Три роли безопасности, используемые для выполнения скриптов, не создаются по умолчанию в Configuration Manager. Чтобы создать средства выполнения скриптов, авторы скриптов и роли утверждающих скриптов, выполните описанные действия.
- В консоли Configuration Manager перейдите в раздел Администрирование>ролей безопасности. >
- Щелкните роль правой кнопкой мыши и выберите команду Копировать. Копируемой роли уже назначены разрешения. Убедитесь, что вы принимаете только нужные разрешения.
- Присвойте настраиваемой роли имя и описание.
- Назначьте роли безопасности разрешения, описанные ниже.
Разрешения ролей безопасности
Имя роли: средства выполнения скриптов
- Описание. Эти разрешения позволяют этой роли выполнять только сценарии, ранее созданные и утвержденные другими ролями.
- Разрешения: Убедитесь, что для следующих элементов задано значение Да.
| Категория | Разрешение | Состояние |
|---|---|---|
| Collection | Запустить сценарий | Да |
| Site | Чтение | Да |
| Скрипты SMS | Чтение | Да |
Имя роли: авторы скриптов
- Описание. Эти разрешения позволяют этой роли создавать скрипты, но они не могут утверждать или запускать их.
- Разрешения. Убедитесь, что заданы следующие разрешения.
| Категория | Разрешение | Состояние |
|---|---|---|
| Collection | Запустить сценарий | Нет |
| Site | Чтение | Да |
| Скрипты SMS | Create | Да |
| Скрипты SMS | Чтение | Да |
| Скрипты SMS | Удалить | Да |
| Скрипты SMS | Изменение | Да |
Имя роли: утверждающие скрипты
- Описание. Эти разрешения позволяют этой роли утверждать скрипты, но они не могут создавать или запускать их.
- Разрешения: Убедитесь, что заданы следующие разрешения.
| Категория | Разрешение | Состояние |
|---|---|---|
| Collection | Запустить сценарий | Нет |
| Site | Чтение | Да |
| Скрипты SMS | Чтение | Да |
| Скрипты SMS | Утвердить | Да |
| Скрипты SMS | Изменение | Да |
Пример разрешений скриптов SMS для роли авторов скриптов

Создание скрипта
- В консоли Configuration Manager щелкните Библиотека программного обеспечения.
- В рабочей области Библиотека программного обеспечения щелкните Скрипты.
- На вкладке Главная в группе Создать щелкните Создать скрипт.
- На странице Скрипт мастера создания скриптов настройте следующие параметры:
- Имя скрипта — введите имя скрипта. Хотя можно создать несколько скриптов с одинаковыми именами, использование повторяющихся имен затрудняет поиск нужного скрипта в консоли Configuration Manager.
- Язык сценариев . В настоящее время поддерживаются только скрипты PowerShell.
- Импорт — импорт скрипта PowerShell в консоль. Скрипт отображается в поле Скрипт .
- Очистить — удаляет текущий скрипт из поля Скрипт.
- Скрипт — отображает импортированный скрипт. Скрипт в этом поле можно изменить при необходимости.
- Завершите работу мастера. Новый скрипт отображается в списке Скрипт с состоянием Ожидание утверждения. Перед запуском этого скрипта на клиентских устройствах необходимо утвердить его.
Избегайте создания скриптов перезагрузки устройства или перезапуска агента Configuration Manager при использовании функции запуска скриптов. Это может привести к непрерывной перезагрузке. При необходимости существуют улучшения функции уведомлений клиента, которые позволяют перезапускать устройства. Столбец ожидающего перезапуска поможет определить устройства, которым требуется перезагрузка.
Параметры скрипта
Добавление параметров в скрипт обеспечивает более гибкую работу. Можно включить до 10 параметров. Ниже описана текущая возможность функции запуска скриптов с параметрами скрипта для. Строковые, целочисленные типы данных. Также доступны списки предустановленных значений. Если скрипт имеет неподдерживаемые типы данных, вы получите предупреждение.
В диалоговом окне Создание скрипта щелкните Параметры скрипта в разделе Скрипт.
Каждый из параметров скрипта имеет собственное диалоговое окно для добавления дополнительных сведений и проверки. Если в скрипте есть параметр по умолчанию, он будет перечислен в пользовательском интерфейсе параметра, и его можно задать. Configuration Manager не перезаписывает значение по умолчанию, так как никогда не изменяет скрипт напрямую. Это можно представить как «предварительно заполненные предлагаемые значения» в пользовательском интерфейсе, но Configuration Manager не предоставляет доступ к значениям по умолчанию во время выполнения. Это можно обойти, изменив скрипт, чтобы иметь правильные значения по умолчанию.
Значения параметров не могут содержать одну кавычку. Существует известная проблема, из-за которой значения параметров, которые включают или заключаются в одинарные кавычки, не передаются скрипту должным образом. При указании значений параметров по умолчанию, содержащих пробел в скрипте, используйте вместо этого двойные кавычки. При указании значений параметров по умолчанию во время создания или выполнения скрипта окружение значения по умолчанию в двойных или одиночных кавычках не требуется независимо от того, содержит ли значение пробел.
Проверка параметров
Каждый параметр в скрипте имеет диалоговое окно Свойства параметра скрипта , в которое можно добавить проверку для этого параметра. После добавления проверки вы должны получить ошибки, если вы вводите значение для параметра, которое не соответствует его проверке.
Пример : FirstName
В этом примере можно задать свойства строкового параметра FirstName.

Раздел проверки диалогового окна Свойства параметра скрипта содержит следующие поля для использования:
- Минимальная длина — минимальное количество символов поля FirstName .
- Максимальная длина — максимальное число символов поля FirstName
- RegEx — сокращение от регулярного выражения. Дополнительные сведения об использовании регулярных выражений см. в следующем разделе Использование проверки регулярных выражений.
- Пользовательская ошибка — полезно для добавления собственного пользовательского сообщения об ошибке, заменяющего любые сообщения об ошибках проверки системы.
Использование проверки регулярных выражений
Регулярное выражение — это компактная форма программирования для проверки строки символов на соответствие закодированной проверке. Например, можно проверка отсутствие заглавного алфавита в поле FirstName, поместив [^A-Z] его в поле RegEx.
Обработка регулярных выражений для этого диалога поддерживается платформа .NET Framework. Рекомендации по использованию регулярных выражений см. в разделах Регулярные выражения иязык регулярных выражений .NET.
Примеры скриптов
Вот несколько примеров, иллюстрирующих скрипты, которые можно использовать с этой возможностью.
Создание папки и файла
Этот скрипт создает новую папку и файл в папке с учетом входных данных именования.
Param( [Parameter(Mandatory=$True)] [string]$FolderName, [Parameter(Mandatory=$True)] [string]$FileName ) New-Item $FolderName -type directory New-Item $FileName -type file
Получение версии ОС
Этот скрипт использует WMI для запроса к компьютеру версии ОС.
Write-Output (Get-WmiObject -Class Win32_operatingSystem).Caption
Изменение или копирование скриптов PowerShell
Вы можете изменить или скопировать существующий скрипт PowerShell, используемый с функцией запуска скриптов . Вместо того, чтобы воссоздать скрипт, который необходимо изменить, теперь измените его напрямую. Оба действия используют тот же интерфейс мастера, что и при создании нового скрипта. При редактировании или копировании скрипта Configuration Manager не сохраняет состояние утверждения.
Не редактируйте скрипт, который активно выполняется на клиентах. Они не завершат выполнение исходного сценария, и вы не можете получить предполагаемые результаты от этих клиентов.
Изменение скрипта
- Перейдите в узел Скрипты в рабочей области Библиотека программного обеспечения .
- Выберите скрипт для редактирования, а затем нажмите кнопку Изменить на ленте.
- Измените или повторно вставьте скрипт на странице Сведения о скрипте .
- Нажмите кнопку Далее , чтобы просмотреть сводку , а затем закрыть после завершения редактирования.
Копирование скрипта
- Перейдите в узел Скрипты в рабочей области Библиотека программного обеспечения .
- Выберите скрипт для копирования и нажмите кнопку Копировать на ленте.
- Переименуйте скрипт в поле Имя скрипта и внесите дополнительные изменения, которые могут потребоваться.
- Нажмите кнопку Далее , чтобы просмотреть сводку , а затем закрыть после завершения редактирования.
Запуск сценария
После утверждения скрипта его можно запустить на одном устройстве или в коллекции. После начала выполнения скрипта он быстро запускается через систему с высоким приоритетом, которая истекает в течение одного часа. Затем результаты скрипта возвращаются с помощью системы сообщений о состоянии.
Чтобы выбрать коллекцию целевых объектов для скрипта, выполните приведенные ниже действия.
- В консоли Configuration Manager щелкните Активы и соответствие.
- В рабочей области Активы и соответствие щелкните Коллекции устройств.
- В списке Коллекции устройств щелкните коллекцию устройств, на которых требуется запустить скрипт.
- Выберите коллекцию по своему усмотрению и нажмите кнопку Запустить скрипт.
- На странице Скрипт мастера выполнения скриптов выберите скрипт из списка. Отображаются только утвержденные скрипты.
- Нажмите кнопку Далее, а затем завершите работу мастера.
Если скрипт не выполняется, например из-за отключения целевого устройства в течение одного часа времени, его необходимо запустить еще раз.
Планирование среды выполнения скриптов
Начиная с Configuration Manager текущей версии ветви 2309, теперь можно запланировать среду выполнения скриптов в формате UTC.
Планирование выполнения скрипта в коллекции:

- В консоли Configuration Manager щелкните Активы и соответствие.
- В рабочей области Активы и соответствие щелкните Коллекции устройств.
- В списке Коллекции устройств щелкните коллекцию устройств, на которых вы хотите запланировать выполнение сценария.
- Выберите коллекцию по своему усмотрению и нажмите кнопку Запустить скрипт.
- На странице Планирование установите флажок Запланировать выполнение скрипта и укажите время расписания в формате UTC.
- Проверьте сведения, отображаемые на странице сводки.
- Нажмите кнопку Далее, а затем завершите работу мастера.
Не более двадцати пяти запланированных скриптов будут выполняться каждые 5 минут.
Выполнение целевого компьютера
Скрипт выполняется как учетная запись системы или компьютера на целевых клиентах. Эта учетная запись имеет ограниченный сетевой доступ. Любой доступ к удаленным системам и расположениям со стороны скрипта должен быть подготовлен соответствующим образом.
Мониторинг скриптов
После запуска скрипта на коллекции устройств используйте следующую процедуру для мониторинга операции. Вы можете отслеживать скрипт в режиме реального времени по мере его выполнения, а затем вернуться к состоянию и результатам выполнения заданного скрипта выполнения. Данные о состоянии скрипта очищаются в рамках задачи обслуживания Удаления устаревших операций клиента или удаления скрипта.


- В консоли Configuration Manager щелкните Мониторинг.
- В рабочей области Мониторинг щелкните Состояние скрипта.
- В списке Состояние скрипта отображаются результаты для каждого скрипта, запущенного на клиентских устройствах. Код выхода скрипта 0 , как правило, указывает, что скрипт успешно выполнен.
Планирование мониторинга скриптов в коллекции

- В консоли Configuration Manager щелкните Мониторинг.
- В рабочей области Мониторинг щелкните узел Запланированные скрипты.
- В списке запланированных скриптов появится новая строка.
- Убедитесь, что в списке запланированных скриптов отображается новая строка. Столбец состояния должен иметь значение Scheduled. Столбец ClientOperationId должен быть пустым. Убедитесь, что другие столбцы, такие как имя скрипта, время расписания и т. д., имеют соответствующие значения.
- После времени расписания обновите узел Запланированные скрипты . Столбец состояния должен иметь значение Успешно инициированная клиентом операция. Столбец ClientOperationId должен иметь целочисленное значение.
- В рабочей области Мониторинг щелкните узел Состояние скрипта. Убедитесь, что в списке отображается новая строка, а значение ClientOperationId равно ClientOperationId из узла Запланированные скрипты .
- Щелкните Просмотреть состояние и убедитесь, что отображаются выходные данные скрипта.
Выходные данные скрипта
Вывод возвращаемого скрипта клиента с помощью форматирования JSON путем отправки результатов скрипта в командлет ConvertTo-Json . Формат JSON последовательно возвращает доступные для чтения выходные данные скрипта. Для сценариев, которые не возвращают объекты в качестве выходных данных, командлет ConvertTo-Json преобразует выходные данные в простую строку, возвращаемую клиентом вместо JSON.

- Скрипты, которые получают неизвестный результат или где клиент находится в автономном режиме, не будут отображаться на диаграммах или в наборе данных.
- Избегайте возврата больших выходных данных скрипта, так как они усечены до 4 КБ.
- Преобразуйте объект перечисления в строковое значение в скриптах, чтобы они правильно отображались в формате JSON.
Подробные выходные данные скрипта можно просмотреть в необработанном или структурированном формате JSON. Это форматирование упрощает чтение и анализ выходных данных. Если скрипт возвращает допустимый текст в формате JSON или выходные данные могут быть преобразованы в JSON с помощью командлета PowerShell ConvertTo-Json , то подробные выходные данные отображаются как выходные данные JSON или Необработанные выходные данные. В противном случае единственным вариантом является вывод скрипта.
Пример. Выходные данные скрипта можно преобразовать в допустимый JSON
Major Minor Build Revision ----- ----- ----- -------- 5 1 16299 551
Пример. Выходные данные скрипта недопустимый JSON
Команды: Write-Output (Get-WmiObject -Class Win32_OperatingSystem).Caption
Microsoft Windows 10 Enterprise
Файлы журнала
- На клиенте по умолчанию в C:\Windows\CCM\logs:
- Scripts.log
- CcmMessaging.log
- MP_RelayMsgMgr.log
- SMS_Message_Processing_Engine.log
Автоматизация с помощью Windows PowerShell
Для автоматизации некоторых из этих задач можно использовать следующие командлеты PowerShell:
- Approve-CMScript
- Deny-CMScript
- Get-CMScript
- Invoke-CMScript
- New-CMScript
- Remove-CMScript
- Set-CMScript
См. также
- Настройка администрирования на основе ролей для Configuration Manager
- Основы ролевого администрирования
Обратная связь
Были ли сведения на этой странице полезными?
Обратная связь
Отправить и просмотреть отзыв по