2017-05-31 4 views
1

Ich habe ein Skript, das Instanzen einer benutzerdefinierten WMI-Klasse basierend auf einer in eine Zeichenfolge konvertierten ACL-Ausgabe erstellen soll. Dies ist letztlich zum Abfragen von Berechtigungen über diese WMI-Klasse.Warum erhalte ich beim Erstellen einer WMI-Instanz einen kritischen Fehler?

Das Fleisch des Prozesses ist:

[cmdletbinding()] 


param([Parameter(ValueFromPipeline=$True, 
    ValueFromPipelineByPropertyName=$True)]$Computer = '.') 

$shares = gwmi -Class win32_share -ComputerName $computer | select -ExpandProperty Name 

foreach ($share in $shares) { 
    $acl = $null 
    #Write-Host $share -ForegroundColor Green 
    #Write-Host $('-' * $share.Length) -ForegroundColor Green 

    $objShareSec = Get-WMIObject -Class Win32_LogicalShareSecuritySetting -Filter "name='$Share'" -ComputerName $computer 

    try { 
     $SD = $objShareSec.GetSecurityDescriptor().Descriptor  

     foreach($ace in $SD.DACL){ 

      $UserName = $ace.Trustee.Name  
      If ($ace.Trustee.Domain -ne $Null) {$UserName = "$($ace.Trustee.Domain)\$UserName"}  
      If ($ace.Trustee.Name -eq $Null) {$UserName = $ace.Trustee.SIDString }  

      [Array]$ACL += New-Object Security.AccessControl.FileSystemAccessRule($UserName, $ace.AccessMask, $ace.AceType) 



      for($i = 1; $i -lt $ACL.Length; $i++) 
      { 
       $permission = $ACL[$i] | Out-String 

       Write-Host "permission for $share is $permission" 

       Set-WmiInstance -Class TestShare -Puttype CreateOnly -Argument @{Name = $share; Permissions = $permission} 
      } 


      } #end foreach ACE    
     } # end try 
    catch 
     { 
     Write-host "Failed to create or update instance for share $share" 
     Write-Host ""  
     } 
    #$ACL 
    # Write-Host $('=' * 50) 
    } # end foreach $share 

, die den unten Fehler zurückgibt:

Set-WmiInstance : Critical error 
At ...\GetShares.ps1:35 char:15 
+ ... Set-WmiInstance -Class LDLocalShare -Puttype CreateOnly - ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (:) [Set-WmiInstance], ManagementException 
    + FullyQualifiedErrorId : SetWMIManagementException,Microsoft.PowerShell.Commands.SetWmiInstance 

Es scheint mit der Art und Weise ein Problem, ich bin Umwandlung Security.AccessControl.FileSystemAccessRule zu eine Zeichenkette, weil die Verwendung des folgenden Codes und die Bereitstellung von Literalstrings eine Instanz ohne Problem mit den entsprechenden Werten erzeugt:

Set-WmiInstance -Class TestShare -Puttype CreateOnly -Argument @{Name = "TestShare" ; Permissions = "TestPermission"} 

Ich habe auf Technet Forum Beiträge im Zusammenhang mit dem Fehler angezeigt, aber das Problem scheint immer mit dem Versuch zu sein, eine Instanz einer Klasse zu erstellen, die nicht erstellt wurde. Die Klasse ist definitiv da. Gibt es eine Möglichkeit, Security.AccessControl.FileSystemAccessRule zu konvertieren, ohne in diese oder eine andere Möglichkeit zu gehen, diese Informationen in einer Instanz einer benutzerdefinierten WMI-Klasse zu speichern?

Edit: Beispiel Ausgabe von $ Erlaubnis, die in eine Zeichenfolge konvertiert wird

FileSystemRights : FullControl 
AccessControlType : Allow 
IdentityReference : Everyone 
IsInherited  : False 
InheritanceFlags : None 
PropagationFlags : None 
+0

Was ist eigentlich in $ Erlaubnis dann? – notjustme

+0

@notjustme hier ein Beispiel: FileSystemRights: Fullcontrol Access: Lassen Sie Identity: Jeder IsInherited: False InheritanceFlags: Keine PropagationFlags: Keine – TheDankOG

Antwort

0

Objekt zu erstellen, können Sie dies tun, indem Sie den folgenden Code-Schnipsel einmal als Administrator ausgeführt wird:

$WMI_Class = "" 
$WMI_Class = New-Object System.Management.ManagementClass("Root\cimv2", $null, $null) 
$WMI_Class.name = 'TestShare' 
$WMI_Class.Properties.Add("Name", [System.Management.CimType]::String, $false) 
$WMI_Class.Properties["Name"].Qualifiers.Add("key", $true) 
$WMI_Class.Properties.Add("Permissions", [System.Management.CimType]::String, $false) 
$WMI_Class.Put() 

Sie kann dies durch Erstellen eines Dummy-Objekts testen (das auch als Admin ausgeführt werden soll):

Set-WmiInstance -Class TestShare -Puttype CreateOnly -Argument @{Name = 'test';Permissions = 'x'} 

Dann

Set-WmiInstance -Class TestShare -Puttype CreateOnly -Argument @{Name = $share;Permissions = $permission.Replace("`r`n","`n")} 

aber, ich habe Freigabenamen definiert als Schlüssel und Eigenschaften nicht Schreib-Kenn hat .So Sie das Objekt zu ändern, später nicht in der Lage sein werden: Der Code sollte mit dieser kleinen Änderung für Set-WmiInstance funktioniert für den gleichen Anteil

+0

Wie ich in meinem Beitrag sagte, ist die Klasse dort, und habe ich eine Dummy Objekt, um es zu testen. Es würde helfen, wenn Sie die gesamte Frage vor der Antwort lesen könnten. – TheDankOG

+0

Das Hinzufügen von .Replace ("' r'n "," ") wurde durchgeführt. Ich nehme an, dass die Eigenschaft keine Zeilenumbrüche enthalten kann. Also muss ich überdenken, wie ich die Klasse strukturiere, wenn dies das erwartete Verhalten ist. – TheDankOG

+0

@TheDankOG Wenn Sie den Zeilenumbruch beibehalten möchten, können Sie diesen ersetzen '' Replace ('' '' '' '' '' '. Ich habe den Code ebenfalls aktualisiert –

Verwandte Themen