簡體   English   中英

如何通過C#代碼為新共享文件夾上的所有用戶設置權限?

[英]How to set permissions to all users on a new share folder , by c# code?

如何通過C#代碼為新共享文件夾上的所有用戶設置權限? 這是我添加共享文件夾的代碼:

public static string sharedFolder()
{
    try
    {
        // create a directory
        Directory.CreateDirectory(@"C:\MyTestShare");
        // Create a ManagementClass object
        ManagementClass managementClass = new ManagementClass("Win32_Share");
        // Create ManagementBaseObjects for in and out parameters
        ManagementBaseObject inParams = managementClass.GetMethodParameters("Create");
        ManagementBaseObject outParams;
        // Set the input parameters
        inParams["Description"] = "My Files Share";
        inParams["Name"] = "My Files Share";
        inParams["Path"] = @"C:\MyTestShare";
        inParams["Type"] = 0x0; // Disk Drive
        // Invoke the method on the ManagementClass object
        //InvokeMethodOptions _invokeMethodOptions=new InvokeMethodOptions.InfiniteTimeout.h
        outParams = managementClass.InvokeMethod("Create", inParams,null);
        setPermissionsToShareFolder(inParams["Path"].ToString());
        // AddDirectorySecurity(inParams["Path"].ToString());
        // Check to see if the method invocation was successful
        if ((uint)(outParams.Properties["ReturnValue"].Value) != 0)
        {

            return ("Unable to share directory.");
        }

       return ("Able to share directory.");

    }
    catch (Exception e)
    {
        throw new Exception(e.Message);
    } 
}

我也一直在搜索,並且主要發現諸如此類的未解決問題。

這是我在不同位置找到的所有代碼片段編寫的代碼:

public static void CreateSharedFolder(string FolderPath, string ShareName, string Description)
{
    try
    {
        // Create a ManagementClass object
        ManagementClass managementClass = new ManagementClass("Win32_Share");

        // Create ManagementBaseObjects for in and out parameters
        ManagementBaseObject inParams = managementClass.GetMethodParameters("Create");

        ManagementBaseObject outParams;

        // Set the input parameters
        inParams["Description"] = Description;
        inParams["Name"] = ShareName;
        inParams["Path"] = FolderPath;
        inParams["Type"] = 0x0; // Disk Drive

        //Another Type:
        // DISK_DRIVE = 0x0
        // PRINT_QUEUE = 0x1
        // DEVICE = 0x2
        // IPC = 0x3
        // DISK_DRIVE_ADMIN = 0x80000000
        // PRINT_QUEUE_ADMIN = 0x80000001
        // DEVICE_ADMIN = 0x80000002
        // IPC_ADMIN = 0x8000003

        //inParams["MaximumAllowed"] = 2;
        inParams["Password"] = null;

        NTAccount everyoneAccount = new NTAccount(null, "EVERYONE");
        SecurityIdentifier sid = (SecurityIdentifier)everyoneAccount.Translate(typeof(SecurityIdentifier));
        byte[] sidArray = new byte[sid.BinaryLength];
        sid.GetBinaryForm(sidArray, 0);

        ManagementObject everyone = new ManagementClass("Win32_Trustee");
        everyone["Domain"] = null;
        everyone["Name"] = "EVERYONE";
        everyone["SID"] = sidArray;

        ManagementObject dacl = new ManagementClass("Win32_Ace");
        dacl["AccessMask"] = 2032127;
        dacl["AceFlags"] = 3;
        dacl["AceType"] = 0;
        dacl["Trustee"] = everyone; 

        ManagementObject securityDescriptor = new ManagementClass("Win32_SecurityDescriptor");
        securityDescriptor["ControlFlags"] = 4; //SE_DACL_PRESENT 
        securityDescriptor["DACL"] = new object[] { dacl };

        inParams["Access"] = securityDescriptor;

        // Invoke the "create" method on the ManagementClass object
        outParams = managementClass.InvokeMethod("Create", inParams, null);

        // Check to see if the method invocation was successful
        var result = (uint)(outParams.Properties["ReturnValue"].Value);
        switch (result)
        {
            case 0:
                Console.WriteLine("Folder successfuly shared.");
                break;
            case 2:
                Console.WriteLine("Access Denied");
                break;
            case 8:
                Console.WriteLine("Unknown Failure");
                break;
            case 9:
                Console.WriteLine("Invalid Name");
                break;
            case 10:
                Console.WriteLine("Invalid Level");
                break;
            case 21:
                Console.WriteLine("Invalid Parameter");
                break;
            case 22:
                Console.WriteLine("Duplicate Share");
                break;
            case 23:
                Console.WriteLine("Redirected Path");
                break;
            case 24:
                Console.WriteLine("Unknown Device or Directory");
                break;
            case 25:
                Console.WriteLine("Net Name Not Found");
                break;
            default:
                Console.WriteLine("Folder cannot be shared.");
                break;
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("Error:" + ex.Message);
    }
}

internal static void RemoveSharedFolder(string ShareName)
{
    try
    {
        // Create a ManagementClass object
        ManagementClass managementClass = new ManagementClass("Win32_Share");
        ManagementObjectCollection shares = managementClass.GetInstances();
        foreach (ManagementObject share in shares)
        {
            if (Convert.ToString(share["Name"]).Equals(ShareName))
            {
                var result = share.InvokeMethod("Delete", new object[] { });

                // Check to see if the method invocation was successful
                if (Convert.ToInt32(result) != 0)
                {
                    Console.WriteLine("Unable to unshare directory.");
                }
                else
                {
                    Console.WriteLine("Folder successfuly unshared.");
                }
                break;
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("Error:" + ex.Message);
    }
}

“ FolderPath”必須存在。

我假設您對everyone的描述都是“所有用戶”。

Win32_Share類的MSDN創建方法

參量

訪問[輸入]

用戶級別權限的安全描述符。 安全描述符包含有關資源的權限,所有者和訪問功能的信息。 如果未提供此參數或該參數為NULL,則每個人都具有對dhare的讀取權限。 有關更多信息,請參見Win32_SecurityDescriptor和更改安全對象上的訪問安全性。

否則,根據MSDN - Chaning訪問安全性的安全對象 ,你需要使用Win32_LogicalShareSecuritySetting類與SetSecurityDescriptor MSDN上描述的方法- 在Win32_LogicalShareSecuritySetting類SetSecurityDescriptor方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM