У меня есть сценарий, который позволяет делиться папкой и устанавливает разрешения на общий доступ. Скрипт отлично работает, за одним исключением, которое является наиболее важным, если вы хотите создать HomeUse-Directory. Я не могу установить права доступа для группы «Все» с сообщением об ошибке:
Учетная запись "Все" не может быть сопоставлена с идентификатором безопасности.
Итак, я провел небольшое исследование и обнаружил этот очень интересная статья, в которой говорится, что группа «Все» не имела SID до Windows Vista / Server 2008.
После некоторого чтения я обнаружил другой статья под названием «Общеизвестные идентификаторы безопасности». Теперь у меня был SID для группы «Мир / Все», поскольку эти группы не перечислены в AD. Поэтому я изменил свой сценарий на поиск SID напрямую, вместо использования параметра до Windows 2000. К сожалению, это тоже не сработало.
И вот я сейчас, довольно невежественный. Думаю, есть кое-какие обходные пути, но на самом деле мне нравится делать это с группой «Все».
Насколько мне известно, «Все» - это группа, не основанная на AD, такая как «локальный администратор» и «Система». Как ни странно, я могу установить разрешения на совместное использование для «Система», но не для «Все / Мир / СЕБЯ»
Я что-то упускаю?
Я рад слышать любой опыт, который у вас был по этому поводу.
Редактировать:
По запросу - вот код, который выдает ошибку:
Dim SetEntriesResult As UInteger = SetEntriesInAcl(1, ExplicitAccessRule(i), AclPtr, AclPtr)
'Check the result of the SetEntriesInAcl API call
If SetEntriesResult = ERROR_NONE_MAPPED Then
Throw New ApplicationException("The account " & FullAccountName & " could not be mapped to a security identifier (SID).")
ElseIf SetEntriesResult <> 0 Then
Throw New ApplicationException("The account " & FullAccountName & " could not be added to the ACL as the follow error was encountered: " & SetEntriesResult & ".")
End If
Так что это ERROR_NONE_MAPPED
- Ошибка API
Соответствующий код, использованный выше:
<DllImportAttribute("advapi32.dll", EntryPoint:="SetEntriesInAclW")> _
Private Shared Function SetEntriesInAcl(ByVal cCountOfExplicitEntries As Integer, <InAttribute()> ByRef pListOfExplicitEntries As EXPLICIT_ACCESS, <InAttribute()> ByVal OldAcl As System.IntPtr, ByRef NewAcl As System.IntPtr) As UInteger
End Function
Public Shared Function ShareExistingFolder(ByVal ShareName As String, ByVal ShareComment As String, ByVal LocalPath As String, ByVal SharePermissions As List(Of SharePermissionEntry), Optional ByVal ComputerName As String = Nothing) As NET_API_STATUS
'Argument validation
If String.IsNullOrEmpty(ShareName) OrElse String.IsNullOrEmpty(LocalPath) OrElse SharePermissions Is Nothing OrElse SharePermissions.Count = 0 Then
Throw New ArgumentException("Invalid argument specified - ShareName, LocalPath and SharePermissions arguments must not be empty")
End If
'Create array of explicit access rules, one for each user specified in the SharePermissions argument
Dim ExplicitAccessRule(SharePermissions.Count - 1) As EXPLICIT_ACCESS
'This pointer will hold the full ACL (access control list) once the loop below has completed
Dim AclPtr As IntPtr
'Loop through each entry in our list of explicit access rules, build each one and add it to the ACL
For i As Integer = 0 To ExplicitAccessRule.Length - 1
'Build the user or group name
Dim FullAccountName As String = String.Empty
If Not String.IsNullOrEmpty(SharePermissions(i).DomainName) Then
FullAccountName = SharePermissions(i).DomainName & "\"
End If
FullAccountName &= SharePermissions(i).UserOrGroupName
'Create a TRUSTEE structure and populate it with the user account details
Dim Account As New TRUSTEE
With Account
.MultipleTrusteeOperation = MULTIPLE_TRUSTEE_OPERATION.NO_MULTIPLE_TRUSTEE
.pMultipleTrustee = 0
.TrusteeForm = TRUSTEE_FORM.TRUSTEE_IS_NAME
.ptstrName = FullAccountName
.TrusteeType = TRUSTEE_TYPE.TRUSTEE_IS_UNKNOWN
End With
'Populate the explicit access rule for this user/permission
With ExplicitAccessRule(i)
'Set this to an Allow or Deny entry based on what was specified in the AllowOrDeny property
If SharePermissions(i).AllowOrDeny Then
.grfAccessMode = ACCESS_MODE.GRANT_ACCESS
Else
.grfAccessMode = ACCESS_MODE.DENY_ACCESS
End If
'Build the access mask for the share permission specified for this user
If SharePermissions(i).Permission = SharedFolder.SharePermissions.Read Then
.grfAccessPermissions = ACCESS_MASK.GENERIC_READ Or ACCESS_MASK.STANDARD_RIGHTS_READ Or ACCESS_MASK.GENERIC_EXECUTE
ElseIf SharePermissions(i).Permission = SharedFolder.SharePermissions.FullControl Then
.grfAccessPermissions = ACCESS_MASK.GENERIC_ALL
End If
'Not relevant for share permissions so just set to NO_INHERITANCE
.grfInheritance = NO_INHERITANCE
'Set the Trustee to the TRUSTEE structure we created earlier in the loop
.Trustee = Account
End With