2016-03-21 18 views
1

Ich habe zwei Funktionen in PowerShell erstellt, eine, die den Namespace ROOT\CustomCMClasses erstellt und eine, die die Klasse Test erstellt. Dieses Stück funktioniert:WMI-Berechtigungen für 'Domänenbenutzer' festlegen

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() 
    } 
} 

An dieser Stelle ich Domain users Berechtigungen für den neuen Namensraum gewähren muß, damit sie in der Lage, Daten, um es auf dem lokalen Client zu schreiben (kein Remote erforderlich). Dies ist der Punkt, wo ich viele Informationen finde, aber jetzt feststecken.

auf dem Microsoft-Blog gibt es eine script ich zu zwicken versucht, aber es ist zu kompliziert für meine Bedürfnisse und es versäumt, so fand ich, und gezwickt den following Code:

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 

Es besagt eindeutig, dass die Berechtigungen sind korrekt angewendet, aber der Benutzer kann weiterhin keine Daten in WMI schreiben. Die Arbeit mit WMI ist neu für mich, daher wird jede Hilfe sehr geschätzt.

Der Code Test, um zu sehen, ob ein normaler Benutzer (Domain users) Berechtigungen verfügt:

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

Antwort

0

das Problem für Partial Write Gelöst:

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' 
} 

Dank this blog und die Microsoft blog zur Erläuterung die Berechtigungen

Verwandte Themen