În prezent, încerc să schimb un script, astfel încât să îl pot pune într-un GPO. Scriptul în sine funcționează, dar vreau să fac un „dacă altfel” în jurul lui.
Scriptul se găsește aici: https://gist.github.com/exchange12rocks/950aa29f66e6369d2c02fa8583bb3a75
Scopul a fost de a verifica dacă există o cheie de registry și dacă nu, creați-o și setați-o la 1. Astfel, Scriptul rulează o singură dată.
Eu am făcut altceva așa:
$isRegKeySet = Get-ItemProperty -Calea 'HKLM:\SYSTEM\PRTGScript' -Nume hasScriptRun -ErrorAction SilentlyContinue | Select-Object -ExpandProperty hasScriptRun
Dacă (1 -eq $isRegKeySet) {
Ieșire
} Else { Scriptul din GitHub }
Partea care creează Cheia este aceasta:
Setare locație HKLM:
New-Item -Path .\System -Name PRTGScript
Pop-Locație
Set-ItemProperty -Cale „HKLM:\System\PRTGScript” -Nume „hasScriptRun” -Valoarea 1
}
Nu sunt sigur unde să pun aceste două părți, astfel încât scenariul să funcționeze. Nu sunt un profesionist Powershell, din păcate.
Scriptul meu este acesta:
# Drepturi de autor (c) Microsoft Corporation. Toate drepturile rezervate.
# Numai pentru uz personal. Furnizat CA ESTE și CU TOATE DEFECTELE.
# Set-WmiNamespaceSecurity.ps1
# Exemplu: Set-WmiNamespaceSecurity root/cimv2 add steve Enable, RemoteAccess
Param ( [parametru(Obligatoriu=$true,Poziție=0)][șir] $namespace,
[parametru(Obligatoriu=$adevărat,Poziție=1)][șir] $operație,
[parametru(Obligatoriu=$adevărat,Poziție=2)][șir] $cont,
[parametru(Poziție=3)][șir[]] $permisiuni = $null,
[bool] $allowInherit = $false,
[bool] $deny = $false,
[șir] $computerName = ".",
[System.Management.Automation.PSCredential] $credential = $null)
Proces {
$ErrorActionPreference = „Oprire”
Funcția 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 = "Activare","MethodExecute","FullWrite","PartialWrite",`
"ProviderWrite","RemoteAccess","ReadSecurity","WriteSecurity"
$permissionTable = @{}
pentru ($i = 0; $i -lt $WBEM_RIGHTS_FLAGS.Lungime; $i++) {
$permissionTable.Add($WBEM_RIGHTS_STRINGS[$i].ToLower(), $WBEM_RIGHTS_FLAGS[$i])
}
$accessMask = 0
foreach ($permission în $permissions) {
dacă (-nu $permissionTable.ContainsKey($permission.ToLower())) {
throw „Permisiune necunoscută: $permission`nPermisiuni valide: $($permissionTable.Keys)”
}
$accessMask += $permissionTable[$permission.ToLower()]
}
$accessMask
}
$isRegKeySet = Get-ItemProperty -Calea 'HKLM:\SYSTEM\PRTGScript' -Nume hasScriptRun -ErrorAction SilentlyContinue | Select-Object -ExpandProperty hasScriptRun
Dacă (1 -eq $isRegKeySet) {
Ieșire
} Altfel {
dacă ($PSBoundParameters.ContainsKey(„Credential”)) {
$remoteparams = @{ComputerName=$computer;Credential=$credential}
} altfel {
$remoteparams = @{ComputerName=$computerName}
}
$invokeparams = @{Namspace=$namespace;Path="__systemsecurity=@"} + $remoteParams
$output = Invoke-WmiMethod @invokeparams -Name GetSecurityDescriptor
dacă ($output.ReturnValue -ne 0) {
throw „GetSecurityDescriptor a eșuat: $($output.ReturnValue)”
}
$acl = $ieșire.Descriptor
$OBJECT_INHERIT_ACE_FLAG = 0x1
$CONTAINER_INHERIT_ACE_FLAG = 0x2
$computerName = (Get-WmiObject @remoteparams Win32_ComputerSystem).Nume
dacă ($cont.Conține('\')) {
$domainaccount = $cont.Split('\')
$domain = $domainaccount[0]
dacă (($domain -eq ".") -sau ($domain -eq "BUILTIN")) {
$domain = $computerName
}
$numecont = $domainaccount[1]
} elseif ($account.Contains('@')) {
$domainaccount = $cont.Split('@')
$domain = $domainaccount[1].Split('.')[0]
$numecont = $domainaccount[0]
} altfel {
$domain = $computerName
$numecont = $cont
}
$getparams = @{Class="Win32_Account";Filter="Domain='$domain' and Name='$accountname'"}
$win32account = Get-WmiObject @getparams
dacă ($win32account -eq $null) {
throw „Contul nu a fost găsit: $account”
}
comutator ($operare) {
"adăuga" {
dacă ($permisiuni -eq $null) {
throw "-Permisiunile trebuie specificate pentru o operațiune de adăugare"
}
$accessMask = Get-AccessMaskFromPermission($permisiuni)
$ace = (New-Object System.Management.ManagementClass("win32_Ace")).CreateInstance()
$ace.AccessMask = $accessMask
dacă ($allowInherit) {
$ace.AceFlags = $OBJECT_INHERIT_ACE_FLAG + $CONTAINER_INHERIT_ACE_FLAG
} altfel {
$as.AceFlags = 0
}
$trustee = (New-Object System.Management.ManagementClass("win32_Trustee")).CreateInstance()
$trustee.SidString = $win32account.Sid
$ace.Trustee = $trustee
$ACCESS_ALLOWED_ACE_TYPE = 0x0
$ACCESS_DENIED_ACE_TYPE = 0x1
dacă ($nega) {
$ace.AceType = $ACCESS_DENIED_ACE_TYPE
} altfel {
$ace.AceType = $ACCESS_ALLOWED_ACE_TYPE
}
$acl.DACL += $ace.psobject.immediateBaseObject
}
"șterge" {
dacă ($permisiuni -ne $null) {
throw „Permisiunile nu pot fi specificate pentru o operațiune de ștergere”
}
[System.Management.ManagementBaseObject[]]$newDACL = @()
foreach ($as în $acl.DACL) {
dacă ($ace.Trustee.SidString -ne $win32account.Sid) {
$newDACL += $ace.psobject.immediateBaseObject
}
}
$acl.DACL = $newDACL.psobject.immediateBaseObject
}
Mod implicit {
throw "Operație necunoscută: $operation`nOperațiuni permise: adăugați ștergere"
}
}
$setparams = @{Name="SetSecurityDescriptor";ArgumentList=$acl.psobject.immediateBaseObject} + $invokeParams
$output = Invoke-WmiMethod @setparams
dacă ($output.ReturnValue -ne 0) {
throw „SetSecurityDescriptor a eșuat: $($output.ReturnValue)”
}
}
Setare locație HKLM:
New-Item -Path .\System -Name PRTGScript
Pop-Locație
Set-ItemProperty -Cale „HKLM:\System\PRTGScript” -Nume „hasScriptRun” -Valoarea 1
}
Multumesc pentru ajutor.