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
Was ist eigentlich in $ Erlaubnis dann? – notjustme
@notjustme hier ein Beispiel: FileSystemRights: Fullcontrol Access: Lassen Sie Identity: Jeder IsInherited: False InheritanceFlags: Keine PropagationFlags: Keine – TheDankOG