Рейтинг:1

Настройка сценария Powershell Разрешения WMI CIMV2

флаг nl

В настоящее время я пытаюсь изменить сценарий, чтобы поместить его в объект групповой политики. Сам скрипт работает, но я хочу сделать вокруг него «если еще».

Скрипт находится здесь: https://gist.github.com/exchange12rocks/950aa29f66e6369d2c02fa8583bb3a75

Цель состояла в том, чтобы проверить, существует ли раздел реестра, а если нет, создать его и установить для него значение 1. Таким образом, сценарий запускается только один раз.

Я сделал это, если еще так:

$isRegKeySet = Get-ItemProperty -Path 'HKLM:\SYSTEM\PRTGScript' -Name hasScriptRun -ErrorAction SilentlyContinue | Select-Object -ExpandProperty hasScriptRun

    Если (1 -eq $isRegKeySet) {

        выход
    
    } Else { Скрипт с GitHub }

Часть, которая создает ключ, такова:

Установить расположение HKLM:

New-Item -Path .\System -Name PRTGScript

Поп-местоположение

Set-ItemProperty -Path "HKLM:\System\PRTGScript" -Name "hasScriptRun" -Value 1
}

Я не уверен, куда поместить эти две части, чтобы скрипт работал. К сожалению, я не профессионал Powershell.

Мой сценарий таков:

# Авторское право (c) Microsoft Corporation. Все права защищены. 
# Только для личного пользования. Предоставляется КАК ЕСТЬ и СО ВСЕМИ ОШИБКАМИ.
 
# Set-WmiNamespaceSecurity.ps1
# Пример: Set-WmiNamespaceSecurity root/cimv2 add steve Enable,RemoteAccess

Param ( [parameter(Mandatory=$true,Position=0)][string] $namespace,
[параметр(обязательный=$true,Position=1)][строка] $операция,
[параметр(обязательный=$true,Position=2)][строка] $account,
[параметр (Position = 3)] [строка []] $ разрешения = $ ноль,
[bool] $allowInherit = $false,
[bool] $запретить = $false,
[строка] $имя_компьютера = ".",
[System.Management.Automation.PSCredential] $credential = $null)

Процесс {
    $ErrorActionPreference = "Стоп"
 
    Функция Get-AccessMaskFromPermission($permissions) {
        $WBEM_ENABLE = 1
                $WBEM_METHOD_EXECUTE = 2
                $WBEM_FULL_WRITE_REP = 4
                $WBEM_PARTIAL_WRITE_REP = 8
                $WBEM_WRITE_PROVIDER = 0x10
                $WBEM_REMOTE_ACCESS = 0x20
                $WBEM_RIGHT_SUBSCRIBE = 0x40
                $WBEM_RIGHT_PUBLISH = 0x80
        $READ_CONTROL = 0x20000
        $WRITE_DAC = 0x40000
       
        $WBEM_RIGHTS_FLAGS = $WBEM_ENABLE,$WBEM_METHOD_EXECUTE,$WBEM_FULL_WRITE_REP,`
            $WBEM_PARTIAL_WRITE_REP,$WBEM_WRITE_PROVIDER,$WBEM_REMOTE_ACCESS,`
            $READ_CONTROL,$WRITE_DAC
        $WBEM_RIGHTS_STRINGS = "Включить", "Выполнение метода", "Полная запись", "Частичная запись",`
            "ProviderWrite", "RemoteAccess", "ReadSecurity", "WriteSecurity"
 
        $permissionTable = @{}
 
        for ($i = 0; $i -lt $WBEM_RIGHTS_FLAGS.Length; $i++) {
            $permissionTable.Add($WBEM_RIGHTS_STRINGS[$i].ToLower(), $WBEM_RIGHTS_FLAGS[$i])
        }
       
        $accessMask = 0
 
        foreach ($ разрешение в $ разрешения) {
            если (-не $permissionTable.ContainsKey($permission.ToLower())) {
                выбросить «Неизвестное разрешение: $permission`nДействительные разрешения: $($permissionTable.Keys)»
            }
            $accessMask += $permissionTable[$permission.ToLower()]
        }
       
        $accessMask
    }
 
    $isRegKeySet = Get-ItemProperty -Path 'HKLM:\SYSTEM\PRTGScript' -Name hasScriptRun -ErrorAction SilentlyContinue | Select-Object -ExpandProperty hasScriptRun

    Если (1 -eq $isRegKeySet) {

        выход
    
    } Еще {   
        
    если ($PSBoundParameters.ContainsKey("Учетные данные")) {
        $remoteparams = @{ComputerName=$computer;Credential=$credential}
    } еще {
        $remoteparams = @{ComputerName=$computerName}
    }
       
    $invokeparams = @{Namespace=$namespace;Path="__systemsecurity=@"} + $remoteParams
 
    $output = Invoke-WmiMethod @invokeparams -Name GetSecurityDescriptor
    если ($output.ReturnValue -ne 0) {
        бросить "Ошибка GetSecurityDescriptor: $($output.ReturnValue)"
    }
 
    $acl = $output.дескриптор
    $OBJECT_INHERIT_ACE_FLAG = 0x1
    $CONTAINER_INHERIT_ACE_FLAG = 0x2
 
    $computerName = (Get-WmiObject @remoteparams Win32_ComputerSystem).Имя
   
    если ($account.Contains('\')) {
        $domainaccount = $account.Split('\')
        $домен = $доменаккаунт[0]
        if (($domain -eq ".") -or ($domain -eq "ВСТРОЕННЫЙ")) {
            $домен = $имя_компьютера
        }
        $accountname = $domainaccount[1]
    } elseif ($account.Contains('@')) {
        $domainaccount = $account.Split('@')
        $domain = $domainaccount[1].Split('.')[0]
        $accountname = $domainaccount[0]
    } еще {
        $домен = $имя_компьютера
        $имяаккаунта = $аккаунт
    }
 
    $getparams = @{Class="Win32_Account";Filter="Domain='$domain' и Name='$accountname'"}
 
    $win32account = Get-WmiObject @getparams
 
    если ($win32account -eq $null) {
        выбросить «Учетная запись не найдена: $ учетная запись»
    }
 
    переключатель ($ операция) {
        "Добавлять" {
            если ($разрешения -eq $null) {
                throw "-Разрешения должны быть указаны для операции добавления"
            }
            $accessMask = Get-AccessMaskFromPermission($разрешения)
   
            $ace = (Новый объект System.Management.ManagementClass("win32_Ace")).CreateInstance()
            $ace.AccessMask = $accessMask
            если ($allowInherit) {
                $ace.AceFlags = $OBJECT_INHERIT_ACE_FLAG + $CONTAINER_INHERIT_ACE_FLAG
            } еще {
                $ace.AceFlags = 0
            }
                       
            $trustee = (Новый объект System.Management.ManagementClass("win32_Trustee")).CreateInstance()
            $trustee.SidString = $win32account.Sid
            $ace.Trustee = $доверенное лицо
           
            $ACCESS_ALLOWED_ACE_TYPE = 0x0
            $ACCESS_DENIED_ACE_TYPE = 0x1
 
            если ($ отклонить) {
                $ace.AceType = $ACCESS_DENIED_ACE_TYPE
            } еще {
                $ace.AceType = $ACCESS_ALLOWED_ACE_TYPE
            }
 
            $acl.DACL += $ace.psobject.immediateBaseObject
        }
       
        "удалять" {
            если ($разрешения -ne $null) {
                throw «Разрешения не могут быть указаны для операции удаления»
            }
       
            [System.Management.ManagementBaseObject[]]$newDACL = @()
            foreach ($ace в $acl.DACL) {
                если ($ace.Trustee.SidString -ne $win32account.Sid) {
                    $newDACL += $ace.psobject.immediateBaseObject
                }
            }
 
            $acl.DACL = $newDACL.psobject.immediateBaseObject
        }
       
        По умолчанию {
            бросить "Неизвестная операция: $operation`nРазрешенные операции: добавить удалить"
        }
    }
 
    $setparams = @{Name="SetSecurityDescriptor";ArgumentList=$acl.psobject.immediateBaseObject} + $invokeParams
 
    $output = Invoke-WmiMethod @setparams
    если ($output.ReturnValue -ne 0) {
        бросить "Ошибка SetSecurityDescriptor: $($output.ReturnValue)"
    }
}
Установить расположение HKLM:

New-Item -Path .\System -Name PRTGScript

Поп-местоположение

Set-ItemProperty -Path "HKLM:\System\PRTGScript" -Name "hasScriptRun" -Value 1
}

Спасибо за помощь.

Ответить или комментировать

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