Мы пытаемся написать функцию для машины под управлением Windows Server 2008, которая должна удалить всех текущих опекунов из ACL разрешений общего ресурса и добавить группу Everyone
с доступом FullControl
. Было бы здорово, если бы мы могли использовать более быстрые CIM CmdLets вместо WMI.
Код:
$ShareName = 'Folder'
$trustee = New-CimInstance (Get-CimClass Win32_Trustee) -ClientOnly
$trustee.Domain = $null
$trustee.Name = 'EVERYONE'
$ace = New-CimInstance (Get-CimClass Win32_ACE) -ClientOnly
$ace.AccessMask = [Uint32][System.Security.AccessControl.FileSystemRights]::FullControl
$ace.AceFlags = [Uint32][System.Security.AccessControl.AceFlags]::None
$ace.AceType = [Uint32][System.Security.AccessControl.AceType]::AccessAllowed
$ace.Trustee = $trustee
$sd = New-CimInstance (Get-CimClass Win32_SecurityDescriptor) -ClientOnly
$sd.DACL = $ace
$sd.group = $trustee
$sd.owner = $trustee
$lss = Get-CimInstance -ClassName Win32_LogicalShareSecuritySetting -filter "Name='$ShareName'"
Invoke-CimMethod -InputObject $lss -MethodName SetSecurityDescriptor -Arguments @{Descriptor = $sd}
Часть кода была найдена здесь.
При выполнении последней строки:
Invoke-CimMethod -InputObject $lss -MethodName SetSecurityDescriptor -Arguments @{Descriptor = $sd}
Выход ReturnValue 21
генерируется. После некоторого поиска в Google это выглядит как Неверный параметр . Но мы не видим, чего нам здесь не хватает ...