Как мне установить права доступа к общему ресурсу в Windows 8

#c# #vb.net #windows #security

#c# #vb.net #Windows #Безопасность

Вопрос:

Приведенный ниже код отлично работает при настройке разрешений на компьютерах под управлением NT, но кое-что в Windows 8 работает по-другому. Код создаст общий ресурс в Windows 8, но не повлияет на страницу «Права доступа к общему ресурсу» в свойствах общего ресурса.

Чтобы перейти на страницу свойств, о которой я говорю, щелкните правой кнопкой мыши на общем ресурсе и выберите свойства. Оттуда выберите вкладку «Общий доступ» и выберите «Расширенный общий доступ». Отсюда нажмите кнопку «Разрешения». В группах будет отображаться «Все», а в нижней части диалогового окна будут доступны опции для разрешений «Полный контроль», «Изменение» и «Чтение». Это параметры, которые мне нужно выбрать программно. Как я уже сказал, тот же код выполняет это в Vista / Win 7, но не в Windows 8.

Кто-нибудь, пожалуйста, может сказать мне, как это сделать в Windows 8? Ответ может быть на VB или C #, любой из них подойдет.

 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" amp; i)

        Dim inParams As ManagementBaseObject = ManageClass.GetMethodParameters("Create")
        inParams("Description") = ""
        inParams("Name") = CreatedShareName
        inParams("Path") = DirectoryToShare
        inParams("Type") = amp;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 amp; ".Name='" amp; CreatedShareName amp; "'")

    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
  

Комментарии:

1. Вы отлаживали этот код в Win 8? Какая часть функции не выполняет то, что должна?

2. Общий ресурс будет создан. Ничего не выдает и исключение, просто разрешения остаются пустыми, когда оно завершается.

Ответ №1:

Я обнаружил проблему.

Проблема в том, что я перепутал флаг доступа.

В моем коде это 2302127

Он должен читать 2032127

По какой-то причине 0 и 3 были перевернуты.