Приведенный ниже код отлично работает при настройке разрешений на машинах на базе NT, но что-то о Windows 8 работает по-разному. Код создаст общий ресурс в Windows 8, но не повлияет на страницу "Разрешения общего доступа" к свойствам общего доступа.
Чтобы перейти на страницу свойств, я говорю о том, чтобы щелкнуть правой кнопкой мыши на ресурсе и выбрать свойства. Оттуда откройте вкладку "Совместное использование" и выберите "Расширенный доступ". Здесь нажмите кнопку "Разрешения". Группы покажут "Все", и будут доступны опции "Полный доступ", "Изменить" и "Читать" в нижней части диалогового окна. Это варианты, которые мне нужно программно выбрать. Как я уже сказал, тот же код выполняет это в Vista/Win 7, но не в Windows 8.
Может кто-нибудь, пожалуйста, скажите мне, как это сделать в Windows 8? Ответ может быть в VB или С#, либо это нормально.
Private Function CreateWindowsShare(ByVal DirectoryToShare As String) As String
Dim ManageClass As New ManagementClass("Win32_Share")
Dim ReturnStatus As UInt32 = 0
Dim i As Integer = 1
Dim CreatedShareName As String
Do
CreatedShareName = IIf(i = 1, "TestShare", "TestShare" & i)
Dim inParams As ManagementBaseObject = ManageClass.GetMethodParameters("Create")
inParams("Description") = ""
inParams("Name") = CreatedShareName
inParams("Path") = DirectoryToShare
inParams("Type") = &H0
Dim outParams As ManagementBaseObject = ManageClass.InvokeMethod("Create", inParams, Nothing)
ReturnStatus = Convert.ToUInt32(outParams.Properties("ReturnValue").Value)
i += 1
Loop While ReturnStatus = MethodStatus.DuplicateShare
If ReturnStatus <> 0 Then
Throw New Exception("Unable to create share.")
End If
' For more info see:
'http://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/de213b61-dc7e-4f33-acdb-893aa96837fa/c-set-directory-sharing-permission-full-control-for-everyone-programmatically-in-windows-7-or?forum=windowssdk
Dim ntAccount As New NTAccount("Everyone")
Dim UserSID As SecurityIdentifier = ntAccount.Translate(GetType(SecurityIdentifier))
Dim UtenteSIDArray(UserSID.BinaryLength) As Byte
UserSID.GetBinaryForm(UtenteSIDArray, 0)
Dim UserTrustee As New ManagementClass(New ManagementPath("Win32_Trustee"), Nothing)
UserTrustee("Name") = "Everyone"
UserTrustee("SID") = UtenteSIDArray
Dim UserACE As New ManagementClass(New ManagementPath("Win32_Ace"), Nothing)
UserACE("AccessMask") = 2302127 ' <-Full Access
UserACE("AceFlags") = AceFlags.ObjectInherit Or AceFlags.ContainerInherit
UserACE("AceType") = AceType.AccessAllowed
UserACE("Trustee") = UserTrustee
Dim UserSecurityDescriptor As New ManagementClass(New ManagementPath("Win32_SecurityDescriptor"), Nothing)
UserSecurityDescriptor("ControlFlags") = 4 ' SE_DACL_PRESENT
UserSecurityDescriptor("DACL") = New Object() {UserACE}
Dim ShareClass As New ManagementClass("Win32_Share")
Dim Share As New ManagementObject(ShareClass.Path.ToString & ".Name='" & CreatedShareName & "'")
Share.InvokeMethod("SetShareInfo", New Object() {Int32.MaxValue, "", UserSecurityDescriptor})
Return CreatedShareName
End Function
Public Enum MethodStatus
Success = 0 'Success
AccessDenied = 2 'Access denied
UnknownFailure = 8 'Unknown failure
InvalidName = 9 'Invalid name
InvalidLevel = 10 'Invalid level
InvalidParameter = 21 'Invalid parameter
DuplicateShare = 22 'Duplicate share
RedirectedPath = 23 'Redirected path
UnknownDevice = 24 'Unknown device or directory
NetNameNotFound = 25 'Net name not found
End Enum
Я нашел проблему.
Проблема в том, что я испортил флаг доступа.
В моем коде его 2302127
Он должен читать 2032127
По какой-то причине 0 и 3 были перевернуты.