Điểm:1

Cài đặt tập lệnh Powershell Quyền WMI CIMV2

lá cờ nl

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 đỡ.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.