2017-05-31 69 views
1

我有一个脚本,用于根据转换为字符串的ACL输出创建自定义WMI类的实例。这最终是通过该WMI类查询权限。为什么在创建WMI实例时收到严重错误?

过程的肉:

[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 

它返回以下错误:

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 

似乎与我转换Security.AccessControl.FileSystemAccessRule的方式问题一个字符串,因为使用下面的代码并提供文字字符串创建一个没有问题的实例,并带有适当的值:

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

我环顾了technet论坛发布的与错误有关的帖子,但这个问题似乎总是试图创建一个未创建的类的实例。这个班肯定是在那里。有没有办法将Security.AccessControl.FileSystemAccessRule转换为这种方式,或者将这些信息存储在自定义WMI类的实例中的方法?

编辑:$权限,这被转换为字符串

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

什么是$权限然后呢?这里 – notjustme

+0

@notjustme是一个例子: FileSystemRights:FullControl AccessControlType:允许 的IdentityReference:大家 IsInherited:假 InheritanceFlags:无 PropagationFlags:无 – TheDankOG

回答

0

要创建的对象的示例输出,您可以通过以管理员身份运行一次下面的代码片段做到这一点:

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

你可以通过创建一个虚拟对象来测试(也应该以admin身份运行):

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

然后你的代码应该可以正常工作与设置wmiinstance这个小变化:

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

,但是,我已经定义的共享名称为键和属性没有写预选赛。所以,你将无法再进行修改的对象对于相同的份额

+0

正如我在文章中说,类是存在的,并且我创建了一个虚拟对象来测试它。如果您在回答之前可以阅读完整个问题,这将有所帮助。 – TheDankOG

+0

添加.Replace(“'r'n”,“”)确实通过了,我想该属性不能有换行符。因此,如果这是预期的行为,我需要重新考虑如何构造类。 – TheDankOG

+0

@TheDankOG如果你想保留换行符,那么你可以使用这个替换''替换(''r'n“,”'n“)''。我也更新了代码 –

相关问题