2016-03-21 20 views
1

PowerShellには、名前空間ROOT\CustomCMClassesを作成する関数とTestを作成する関数の2つが作成されています。私は新しい名前空間にDomain users権限を付与する必要があります。この時点で「ドメインユーザー」のWMIアクセス許可を設定する

Param (
    $Namespace = 'CustomCMClasses', 
    $Class  = 'Test' 
) 

Function New-WMINamespaceHC{ 
    if (Get-WmiObject -Namespace 'root' -Class '__NAMESPACE' | Where-Object {$_.Name -eq $Namespace}) { 
     Write-Verbose "WMI Namespace 'root\$Namespace' exists" 
    } 
    else { 
     Write-Verbose "Create WMI namespace 'root\$Namespace'" 
     $Ns = [WMICLASS]'root:__Namespace' 
     $NewNamespace = $Ns.createInstance() 
     $NewNamespace.Name = $Namespace 
     $NewNamespace.Put() 
    } 
} 

Function New-WMIClassHC { 
    if (Get-WmiObject -List -Namespace "root\$Namespace" | Where-Object {$_.Name -eq $Class}) { 
     Write-Verbose "WMI Class '$Class' exists" 
    } 
    else { 
     Write-Verbose "Create WMI Class '$Class'" 
     $NewClass = New-Object System.Management.ManagementClass ("root\$Namespace", [String]::Empty, $Null); 
     $NewClass['__CLASS'] = $Class 
     $NewClass.Qualifiers.Add('Static', $true) 
     $NewClass.Properties.Add('Key', [System.Management.CimType]::String, $false) 
     $NewClass.Properties['Key'].Qualifiers.Add('Key', $true) 
     $NewClass.Properties.Add('Value1', [System.Management.CimType]::UInt32, $false) 
     $NewClass.Properties.Add('Value2', [System.Management.CimType]::String, $false) 
     $NewClass.Put() 
    } 
} 

をので、彼らは彼らのローカルクライアント(不要リモート)でそれにデータを書き込むことができます:この作品は正常に動作します。これは私が多くの情報を見つけるが、今は立ち往生しているところです。マイクロソフトのブログに

私は微調整しようとしたが、それは私のニーズのために過度に複雑だと、それは私がfollowingコード発見し、微調整失敗scriptがあります:明確に権限があることを述べています

Function Add-WMIPermissions { 
    [CmdLetBinding()] 
    Param (
     [String]$Principal = 'DOMAIN.NET\Domain users', 
     [String]$Namespace = 'CustomCMClasses' 
    ) 

    Function Get-Sid { 
     Param (
      $DSIdentity 
     ) 
     $ID = new-object System.Security.Principal.NTAccount($DSIdentity) 
     Return $ID.Translate([System.Security.Principal.SecurityIdentifier]).toString() 
    } 

    $Sid = Get-Sid $Principal 

    $WMISDDL = "A;CI;CCWP;;;$Sid" 
    $WMISDDLPartialMatch = "A;\w*;\w+;;;$Sid" 

    $security = Get-WmiObject -Namespace root\$Namespace -Class __SystemSecurity 
    $binarySD = @($null) 
    $result = $security.PsBase.InvokeMethod('GetSD',$binarySD) 

    $converter = New-Object system.management.ManagementClass Win32_SecurityDescriptorHelper 
    $CurrentWMISDDL = $converter.BinarySDToSDDL($binarySD[0]) 

    if (($CurrentWMISDDL.SDDL -match $WMISDDLPartialMatch) -and ($CurrentWMISDDL.SDDL -notmatch $WMISDDL)) { 
     $NewWMISDDL = $CurrentWMISDDL.SDDL -replace $WMISDDLPartialMatch, $WMISDDL 
    } 
    else { 
     $NewWMISDDL = $CurrentWMISDDL.SDDL += '(' + $WMISDDL + ')' 
    } 

    $WMIbinarySD = $converter.SDDLToBinarySD($NewWMISDDL) 
    $WMIconvertedPermissions = ,$WMIbinarySD.BinarySD 

    if ($CurrentWMISDDL.SDDL -match $WMISDDL) { 
     Write-Verbose 'Current WMI Permissions matches desired value' 
    } 
    else { 
     $result = $security.PsBase.InvokeMethod('SetSD',$WMIconvertedPermissions) 
     if($result='0'){ 
      Write-Verbose 'WMI permissions applied' 
     } 
    } 
} 

Add-WMIPermissions -Verbose 

は、正しく適用されますが、ユーザーはWMIにデータを書き込むことができません。 WMIを使って作業することは私には新しく、どんな助けでも大歓迎です。

通常のユーザー(Domain users)は権限があるかどうかを確認するためにテストコード:

$WMIClass = [WMICLASS]('root\' + $Namespace + ':' + $Class) 
$WMIInstance = $WMIClass.CreateInstance() 
$WMIInstance.Key = 'Unique value identifier 5' 
$WMIInstance.Value1 = 101 
$WMIInstance.Value2 = 'Status Ok' 
$WMIInstance.Put() 

答えて

0

部分書き込みのための問題を解決:

Function Set-WMIPermissionsHC { 
    Param (
     [String]$Namespace = 'CustomCMClasses', 
     [String]$Class  = 'Test', 
     [String]$Account = 'DOMAIN\Domain users', 
     [String]$Computer = $env:COMPUTERNAME 
    ) 

    Function Get-Sid { 
     Param (
      $Account 
     ) 
     $ID = New-Object System.Security.Principal.NTAccount($Account) 
     Return $ID.Translate([System.Security.Principal.SecurityIdentifier]).toString() 
    } 

    $SID = Get-Sid $Account 
    $SDDL = "A;CI;CCSWWP;;;$SID" 
    $DCOMSDDL = "A;;CCDCRP;;;$SID" 
    $Reg = [WMICLASS]"\\$Computer\root\default:StdRegProv" 
    $DCOM = $Reg.GetBinaryValue(2147483650,'software\microsoft\ole','MachineLaunchRestriction').uValue 
    $Security = Get-WmiObject -ComputerName $Computer -Namespace "root\$Namespace" -Class __SystemSecurity 
    $Converter = New-Object System.Management.ManagementClass Win32_SecurityDescriptorHelper 
    $BinarySD = @($null) 
    $Result = $Security.PsBase.InvokeMethod('GetSD', $BinarySD) 
    $OutSDDL = $Converter.BinarySDToSDDL($BinarySD[0]) 
    $OutDCOMSDDL = $Converter.BinarySDToSDDL($DCOM) 
    $NewSDDL = $OutSDDL.SDDL += '(' + $SDDL + ')' 
    $NewDCOMSDDL = $OutDCOMSDDL.SDDL += '(' + $DCOMSDDL + ')' 
    $WMIbinarySD = $Converter.SDDLToBinarySD($NewSDDL) 
    $WMIconvertedPermissions = ,$WMIbinarySD.BinarySD 
    $DCOMbinarySD = $Converter.SDDLToBinarySD($NewDCOMSDDL) 
    $DCOMconvertedPermissions = ,$DCOMbinarySD.BinarySD 
    $Result = $Security.PsBase.InvokeMethod('SetSD', $WMIconvertedPermissions) 
    $Result = $Reg.SetBinaryValue(2147483650,'software\microsoft\ole','MachineLaunchRestriction', $DCOMbinarySD.binarySD) 
    Write-Verbose 'WMI Permissions set' 
} 

説明するためのthis blogMicrosoft blogへの感謝を許可書

関連する問題