Click here to Skip to main content
15,885,546 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
The code below works just fine when setting permissions on NT based machines, but something about windows 8 works differently. The code will create the share on Windows 8, but will not affect the "Share Permissions" page of the share properties.

To get to the properties page I'm talking about right click on a share and choose properties. From there select the "Sharing" tab and choose "Advanced Sharing." From here click the "Permissions" button. The groups will show "Everyone" and there will be options for "Full Control", "Change", and "Read" permissions towards the bottom of the dialog. These are the options I need to programmatically have selected. Like I said, the same code accomplishes this in Vista/Win 7 but not Windows 8.

Can someone please tell me how to do this in Windows 8? The answer can be in VB or C#, either is fine.

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
  
End Class

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
Posted

1 solution

I found the problem.

The issue is I messed up the access flag.

In my code its 2302127

It should read 2032127

The 0 and the 3 were flipped for some reason.
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900