Score:1

สคริปต์ Powershell ตั้งค่าสิทธิ์ WMI CIMV2

ธง nl

ฉันกำลังพยายามเปลี่ยนสคริปต์เพื่อให้สามารถใส่ลงใน GPO ได้ สคริปต์ใช้งานได้ แต่ฉันต้องการทำ "ถ้าเป็นอย่างอื่น" รอบ ๆ

พบสคริปต์ที่นี่: https://gist.github.com/exchange12rocks/950aa29f66e6369d2c02fa8583bb3a75

เป้าหมายคือการตรวจสอบว่ามีคีย์รีจิสทรีอยู่หรือไม่ ถ้าไม่มี ให้สร้างและตั้งค่าเป็น 1 เพื่อให้สคริปต์ทำงานเพียงครั้งเดียวเท่านั้น

ฉันทำอย่างอื่นเช่นนี้:

$isRegKeySet = Get-ItemProperty -Path 'HKLM:\SYSTEM\PRTGScript' -ชื่อ hasScriptRun -ErrorAction SilentlyContinue | เลือกวัตถุ - ขยายคุณสมบัติ hasScriptRun

    ถ้า (1 -eq $isRegKeySet) {

        ทางออก
    
    } อื่น ๆ { สคริปต์จาก GitHub }

ส่วนที่สร้างคีย์คือ:

ตั้งค่าตำแหน่ง HKLM:

รายการใหม่ - เส้นทาง .\System - ชื่อ PRTGScript

Pop-สถานที่

Set-ItemProperty -Path "HKLM:\System\PRTGScript" -ชื่อ "hasScriptRun" -ค่า 1
}

ฉันไม่แน่ใจว่าจะใส่สองส่วนนี้ไว้ที่ไหนเพื่อให้สคริปต์ทำงานได้ ฉันไม่ใช่มือโปร Powershell

สคริปต์ของฉันคือ:

# ลิขสิทธิ์ (c) Microsoft Corporation สงวนลิขสิทธิ์. 
#สำหรับใช้ส่วนตัวเท่านั้น ให้ตามที่เป็นอยู่และด้วยความผิดพลาดทั้งหมด
 
# Set-WmiNamespaceSecurity.ps1
# ตัวอย่าง: Set-WmiNamespaceSecurity root/cimv2 เพิ่ม steve Enable,RemoteAccess

Param ( [พารามิเตอร์(บังคับ=$true,ตำแหน่ง=0)][string] $namespace,
[parameter(Mandatory=$true,Position=1)][string] $operation,
[พารามิเตอร์(บังคับ=$true,ตำแหน่ง=2)][สตริง] $บัญชี
[พารามิเตอร์(ตำแหน่ง=3)][สตริง[]] $permissions = $null
[บูล] $allowInherit = $เท็จ,
[บูล] $ปฏิเสธ = $เท็จ
[string] $computerName = ".",
[System.Management.Automation.PSCredential] $credential = $null)

กระบวนการ {
    $ErrorActionPreference = "หยุด"
 
    ฟังก์ชัน Get-AccessMaskFromPermission($ สิทธิ์) {
        $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 = "เปิดใช้งาน","MethodExecute","FullWrite","PartialWrite",`
            "ProviderWrite", "RemoteAccess", "ReadSecurity", "WriteSecurity"
 
        $permissionTable = @{}
 
        สำหรับ ($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()]
        }
       
        $แอคเซสมาสก์
    }
 
    $isRegKeySet = Get-ItemProperty -Path 'HKLM:\SYSTEM\PRTGScript' -ชื่อ hasScriptRun -ErrorAction SilentlyContinue | เลือกวัตถุ - ขยายคุณสมบัติ hasScriptRun

    ถ้า (1 -eq $isRegKeySet) {

        ทางออก
    
    } อื่น {   
        
    ถ้า ($PSBoundParameters.ContainsKey("ข้อมูลประจำตัว")) {
        $remoteparams = @{ComputerName=$computer;Credential=$credential}
    } อื่น {
        $remoteparams = @{ComputerName=$computerName}
    }
       
    $invokeparams = @{Namespace=$namespace;Path="__systemsecurity=@"} + $remoteParams
 
    $output = เรียกใช้ WmiMethod @invokeparams - ชื่อ GetSecurityDescriptor
    ถ้า ($ output.ReturnValue -ne 0) {
        โยน "GetSecurityDescriptor ล้มเหลว: $($output.ReturnValue)"
    }
 
    $acl = $output.Descriptor
    $OBJECT_INHERIT_ACE_FLAG = 0x1
    $CONTAINER_INHERIT_ACE_FLAG = 0x2
 
    $computerName = (รับ WmiObject @remoteparams Win32_ComputerSystem) ชื่อ
   
    ถ้า ($account.Contains('\')) {
        $domainaccount = $account.Split('\')
        $โดเมน = $domainaccount[0]
        ถ้า (($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]
    } อื่น {
        $domain = $computerName
        $accountname = $บัญชี
    }
 
    $getparams = @{Class="Win32_Account";Filter="Domain='$domain' and Name='$accountname'"}
 
    $win32account = รับ-WmiObject @getparams
 
    ถ้า ($ win32account -eq $null) {
        โยน "ไม่พบบัญชี: $account"
    }
 
    สวิตช์ (การดำเนินการ $) {
        "เพิ่ม" {
            ถ้า ($ สิทธิ์ -eq $null) {
                โยน "ต้องระบุสิทธิ์สำหรับการดำเนินการเพิ่ม"
            }
            $accessMask = Get-AccessMaskFromPermission($permissions)
   
            $ace = (New-Object System.Management.ManagementClass("win32_Ace")).CreateInstance()
            $ace.AccessMask = $accessMask
            ถ้า ($ allowInherit) {
                $ace.AceFlags = $OBJECT_INHERIT_ACE_FLAG + $CONTAINER_INHERIT_ACE_FLAG
            } อื่น {
                $ace.AceFlags = 0
            }
                       
            $trustee = (New-Object 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) {
                โยน "ไม่สามารถระบุการอนุญาตสำหรับการดำเนินการลบ"
            }
       
            [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 = เรียกใช้ WmiMethod @setparams
    ถ้า ($ output.ReturnValue -ne 0) {
        โยน "SetSecurityDescriptor ล้มเหลว: $($output.ReturnValue)"
    }
}
ตั้งค่าตำแหน่ง HKLM:

รายการใหม่ - เส้นทาง .\System - ชื่อ PRTGScript

Pop-สถานที่

Set-ItemProperty -Path "HKLM:\System\PRTGScript" -ชื่อ "hasScriptRun" -ค่า 1
}

ขอบคุณสำหรับความช่วยเหลือ

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา