Tôi hiện đang cố gắng thay đổi tập lệnh để có thể đưa tập lệnh đó vào GPO. Bản thân Script hoạt động nhưng tôi muốn thực hiện "nếu khác" xung quanh nó.
Script được tìm thấy ở đây: https://gist.github.com/exchange12rocks/950aa29f66e6369d2c02fa8583bb3a75
Mục tiêu là để kiểm tra xem khóa đăng ký có tồn tại hay không, nếu không, hãy tạo khóa đó và đặt thành 1. Vì vậy, theo cách đó, Tập lệnh chỉ chạy một lần.
Tôi đã làm nếu khác như thế này:
$isRegKeySet = Get-ItemProperty -Path 'HKLM:\SYSTEM\PRTGScript' -Name hasScriptRun -ErrorAction SilentlyContinue | Chọn đối tượng -ExpandProperty hasScriptRun
Nếu (1 -eq $isRegKeySet) {
lối ra
} Khác { Tập lệnh từ GitHub }
Phần tạo Khóa là đây:
Đặt vị trí HKLM:
Mục mới -Đường dẫn .\Hệ thống -Tên PRTGScript
Pop-Vị trí
Set-ItemProperty -Path "HKLM:\System\PRTGScript" -Name "hasScriptRun" -Giá trị 1
}
Tôi không chắc nên đặt hai phần này ở đâu để kịch bản hoạt động. Thật không may, tôi không phải là một chuyên gia Powershell.
Kịch bản của tôi là thế này:
# Bản quyền (c) Tập đoàn Microsoft. Đã đăng ký Bản quyền.
# Chỉ sử dụng cho cá nhân. Được cung cấp NHƯ LÀ và VỚI MỌI LỖI.
# Đặt-WmiNamespaceSecurity.ps1
# Ví dụ: Set-WmiNamespaceSecurity root/cimv2 add steve Enable,RemoteAccess
Tham số ( [tham số(Bắt buộc=$true,Vị trí=0)][chuỗi] $namespace,
[tham số(Bắt buộc=$true,Vị trí=1)][chuỗi] $hoạt động,
[tham số(Bắt buộc=$true,Vị trí=2)][chuỗi] $account,
[tham số(Vị trí=3)][chuỗi[]] $permissions = $null,
[bool] $allowInherit = $false,
[bool] $deny = $false,
[chuỗi] $computerName = ".",
[System.Management.Automation.PSCredential] $credential = $null)
Tiến trình {
$ErrorActionPreference = "Dừng"
Hàm 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 = "Enable","MethodExecute","FullWrite","PartialWrite",`
"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 ($permission trong $permissions) {
if (-not $permissionTable.ContainsKey($permission.ToLower())) {
ném "Quyền không xác định: $permission`nQuyền hợp lệ: $($permissionTable.Keys)"
}
$accessMask += $permissionTable[$permission.ToLower()]
}
$accessMask
}
$isRegKeySet = Get-ItemProperty -Path 'HKLM:\SYSTEM\PRTGScript' -Name hasScriptRun -ErrorAction SilentlyContinue | Chọn đối tượng -ExpandProperty hasScriptRun
Nếu (1 -eq $isRegKeySet) {
lối ra
} Khác {
if ($PSBoundParameters.ContainsKey("Credential")) {
$remoteparams = @{ComputerName=$computer;Credential=$credential}
} khác {
$remoteparams = @{ComputerName=$computerName}
}
$invokeparams = @{Namespace=$namespace;Path="__systemsecurity=@"} + $remoteParams
$output = Gọi-WmiMethod @invokeparams -Tên GetSecurityDescriptor
if ($output.ReturnValue -ne 0) {
ném "GetSecurityDescriptor không thành công: $($output.ReturnValue)"
}
$acl = $output.Descriptor
$OBJECT_INHERIT_ACE_FLAG = 0x1
$CONTAINER_INHERIT_ACE_FLAG = 0x2
$computerName = (Get-WmiObject @remoteparams Win32_ComputerSystem).Name
nếu ($account.Contains('\')) {
$domainaccount = $account.Split('\')
$domain = $domainaccount[0]
if (($domain -eq ".") -or ($domain -eq "BUILTIN")) {
$domain = $computerName
}
$accountname = $domainaccount[1]
} elseif ($account.Contains('@')) {
$domainaccount = $account.Split('@')
$domain = $domainaccount[1].Split('.')[0]
$accountname = $domainaccount[0]
} khác {
$domain = $computerName
$accountname = $account
}
$getparams = @{Class="Win32_Account";Filter="Domain='$domain' and Name='$accountname'"}
$win32account = Get-WmiObject @getparams
nếu ($win32account -eq $null) {
ném "Không tìm thấy tài khoản: $account"
}
chuyển ($hoạt động) {
"cộng" {
nếu ($ quyền -eq $null) {
ném "-Quyền phải được chỉ định cho thao tác thêm"
}
$accessMask = Get-AccessMaskFromPermission($permissions)
$ace = (New-Object System.Management.ManagementClass("win32_Ace")).CreateInstance()
$ace.AccessMask = $accessMask
nếu ($allowInherit) {
$ace.AceFlags = $OBJECT_INHERIT_ACE_FLAG + $CONTAINER_INHERIT_ACE_FLAG
} khác {
$ace.AceFlags = 0
}
$trustee = (New-Object System.Management.ManagementClass("win32_Trustee")).CreateInstance()
$trustee.SidString = $win32account.Sid
$ace.Trustee = $người được ủy thác
$ACCESS_ALLOWED_ACE_TYPE = 0x0
$ACCESS_DENIED_ACE_TYPE = 0x1
nếu ($ từ chối) {
$ace.AceType = $ACCESS_DENIED_ACE_TYPE
} khác {
$ace.AceType = $ACCESS_ALLOWED_ACE_TYPE
}
$acl.DACL += $ace.psobject.immediateBaseObject
}
"xóa bỏ" {
nếu ($ quyền -ne $null) {
throw "Không thể chỉ định quyền cho thao tác xóa"
}
[System.Management.ManagementBaseObject[]]$newDACL = @()
foreach ($ace trong $acl.DACL) {
if ($ace.Trustee.SidString -ne $win32account.Sid) {
$newDACL += $ace.psobject.immediateBaseObject
}
}
$acl.DACL = $newDACL.psobject.immediateBaseObject
}
mặc định {
ném "Thao tác không xác định: $operation`nHoạt động được phép: thêm xóa"
}
}
$setparams = @{Name="SetSecurityDescriptor";ArgumentList=$acl.psobject.immediateBaseObject} + $invokeParams
$output = Gọi-WmiMethod @setparams
if ($output.ReturnValue -ne 0) {
ném "SetSecurityDescriptor không thành công: $($output.ReturnValue)"
}
}
Đặt vị trí HKLM:
Mục mới -Đường dẫn .\Hệ thống -Tên PRTGScript
Pop-Vị trí
Set-ItemProperty -Path "HKLM:\System\PRTGScript" -Name "hasScriptRun" -Giá trị 1
}
Cảm ơn đã giúp đỡ.