Renjith_R Ответов: 3

Как поделиться папкой и дать разрешение всем в c#


Мне нужно создать папку и сделать ее общей для всех и дать разрешение всем.

Я пробовал это для совместного использования, и это не работает (папка не является общей, когда я проверил свойства)

How-to-Share-Windows-Folders-Using-C [^]

Для разрешения папки я попробовал это сделать,


private static void SetPermissions(string dirPath)
      {
          DirectoryInfo info = new DirectoryInfo(dirPath);
          WindowsIdentity self = System.Security.Principal.WindowsIdentity.GetCurrent();
          DirectorySecurity ds = info.GetAccessControl();
          ds.AddAccessRule(new FileSystemAccessRule(self.Name,
          FileSystemRights.FullControl,
          InheritanceFlags.ObjectInherit |
          InheritanceFlags.ContainerInherit,
          PropagationFlags.None,
          AccessControlType.Allow));
          info.SetAccessControl(ds);
      }



Пожалуйста, помогите с каким-то другим подходом, если это не так.

заранее спасибо

3 Ответов

Рейтинг:
2

Member 10948185

Запустите его от имени администратора. Добавьте файл манифеста в свой проект.

Метод ShareFolder создает каталог и совместно использует его, но разрешение общего доступа доступно только для чтения. Чтобы изменить это разрешение, мы вызовем метод SetPermission.

Добавить ссылку на System.Management.dll

using System;
using System.Management;
using System.IO;
public string ShareFolder(string FolderPath, string ShareName, string Description)
        {
            string strSharePath = FolderPath;
            string strShareName = ShareName;
            string strShareDesc = Description;
            string msg = string.Empty;
            try
            {
                Directory.CreateDirectory(strSharePath);
                ManagementClass oManagementClass = new ManagementClass("Win32_Share");
                ManagementBaseObject inputParameters = oManagementClass.GetMethodParameters("Create");
                ManagementBaseObject outputParameters;
                inputParameters["Description"] = strShareDesc;
                inputParameters["Name"] = strShareName;
                inputParameters["Path"] = strSharePath;
                inputParameters["Type"] = 0x0;//disk drive 
                inputParameters["MaximumAllowed"] = null;
                inputParameters["Access"] = null;

                inputParameters["Password"] = null;


                outputParameters = oManagementClass.InvokeMethod("Create", inputParameters, null);

                if ((uint)(outputParameters.Properties["ReturnValue"].Value) != 0)
                {
                    msg = "There is a problem while sharing the directory.";
                    throw new Exception("There is a problem while sharing the directory.");
                }
                else
                {
                    msg = ("Share Folder has been created with the name :" + strShareName);
                }


            }
            catch (Exception ex)
            {
                msg = (ex.Message.ToString());
            }
            return msg;
        }


Этот метод установит разрешение.

Получить Системный Домен.
string Domain = Environment.UserDomainName;

В методе AddPermission передайте sharedFolderName то же самое, что и shareName, заданное вами в предыдущем методе, или общее имя каталога, для которого вы хотите изменить разрешение. В поле Имя пользователя укажите имя учетной записи, для которой вы хотите установить/изменить разрешение. Пример - все, администраторы и т.д.
using System;
using System.Management;
using System.Globalization;
 public void AddPermissions(string sharedFolderName, string domain, string userName)
        {

            // Step 1 - Getting the user Account Object
            ManagementObject sharedFolder = GetSharedFolderObject(sharedFolderName);
            if (sharedFolder == null)
            {
                System.Diagnostics.Trace.WriteLine("The shared folder with given name does not exist");
                return;
            }

            ManagementBaseObject securityDescriptorObject = sharedFolder.InvokeMethod("GetSecurityDescriptor", null, null);
            if (securityDescriptorObject == null)
            {
                System.Diagnostics.Trace.WriteLine(string.Format(CultureInfo.InvariantCulture, "Error extracting security descriptor of the shared path {0}.", sharedFolderName));
                return;
            }
            int returnCode = Convert.ToInt32(securityDescriptorObject.Properties["ReturnValue"].Value);
            if (returnCode != 0)
            {
                System.Diagnostics.Trace.WriteLine(string.Format(CultureInfo.InvariantCulture, "Error extracting security descriptor of the shared path {0}. Error Code{1}.", sharedFolderName, returnCode.ToString()));
                return;
            }

            ManagementBaseObject securityDescriptor = securityDescriptorObject.Properties["Descriptor"].Value as ManagementBaseObject;

            // Step 2 -- Extract Access Control List from the security descriptor
            int existingAcessControlEntriesCount = 0;
            ManagementBaseObject[] accessControlList = securityDescriptor.Properties["DACL"].Value as ManagementBaseObject[];

            if (accessControlList == null)
            {
                // If there aren't any entries in access control list or the list is empty - create one
                accessControlList = new ManagementBaseObject[1];
            }
            else
            {
                // Otherwise, resize the list to allow for all new users.
                existingAcessControlEntriesCount = accessControlList.Length;
                Array.Resize(ref accessControlList, accessControlList.Length + 1);
            }


            // Step 3 - Getting the user Account Object
            ManagementObject userAccountObject = GetUserAccountObject(domain, userName);
            ManagementObject securityIdentfierObject = new ManagementObject(string.Format("Win32_SID.SID='{0}'", (string)userAccountObject.Properties["SID"].Value));
            securityIdentfierObject.Get();

            // Step 4 - Create Trustee Object
            ManagementObject trusteeObject = CreateTrustee(domain, userName, securityIdentfierObject);

            // Step 5 - Create Access Control Entry
            ManagementObject accessControlEntry = CreateAccessControlEntry(trusteeObject, false);

            // Step 6 - Add Access Control Entry to the Access Control List
            accessControlList[existingAcessControlEntriesCount] = accessControlEntry;

            // Step 7 - Assign access Control list to security desciptor 
            securityDescriptor.Properties["DACL"].Value = accessControlList;

            // Step 8 - Assign access Control list to security desciptor 
            ManagementBaseObject parameterForSetSecurityDescriptor = sharedFolder.GetMethodParameters("SetSecurityDescriptor");
            parameterForSetSecurityDescriptor["Descriptor"] = securityDescriptor;
            sharedFolder.InvokeMethod("SetSecurityDescriptor", parameterForSetSecurityDescriptor, null);
        }

        /// <summary>
        /// The method returns ManagementObject object for the shared folder with given name
        /// </summary>
        /// <param name="sharedFolderName">string containing name of shared folder</param>
        /// <returns>Object of type ManagementObject for the shared folder.</returns>

        private static ManagementObject GetSharedFolderObject(string sharedFolderName)
        {
            ManagementObject sharedFolderObject = null;

            //Creating a searcher object to search 
            ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * from Win32_LogicalShareSecuritySetting where Name = '" + sharedFolderName + "'");
            ManagementObjectCollection resultOfSearch = searcher.Get();
            if (resultOfSearch.Count > 0)
            {
                //The search might return a number of objects with same shared name. I assume there is just going to be one
                foreach (ManagementObject sharedFolder in resultOfSearch)
                {
                    sharedFolderObject = sharedFolder;
                    break;
                }
            }
            return sharedFolderObject;
        }

        /// <summary>
        /// The method returns ManagementObject object for the user folder with given name
        /// </summary>
        /// <param name="domain">string containing domain name of user </param>
        /// <param name="alias">string containing the user's network name </param>
        /// <returns>Object of type ManagementObject for the user folder.</returns>

        private static ManagementObject GetUserAccountObject(string domain, string alias)
        {
            ManagementObject userAccountObject = null;
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(string.Format("select * from Win32_Account where Name = '{0}' and Domain='{1}'", alias, domain));
            ManagementObjectCollection resultOfSearch = searcher.Get();
            if (resultOfSearch.Count > 0)
            {
                foreach (ManagementObject userAccount in resultOfSearch)
                {
                    userAccountObject = userAccount;
                    break;
                }
            }
            return userAccountObject;
        }

        /// <summary>
        /// Returns the Security Identifier Sid of the given user
        /// </summary>
        /// <param name="userAccountObject">The user object who's Sid needs to be returned</param>
        /// <returns></returns>

        private static ManagementObject GetAccountSecurityIdentifier(ManagementBaseObject userAccountObject)
        {
            ManagementObject securityIdentfierObject = new ManagementObject(string.Format("Win32_SID.SID='{0}'", (string)userAccountObject.Properties["SID"].Value));
            securityIdentfierObject.Get();
            return securityIdentfierObject;
        }

        /// <summary>
        /// Create a trustee object for the given user
        /// </summary>
        /// <param name="domain">name of domain</param>
        /// <param name="userName">the network name of the user</param>
        /// <param name="securityIdentifierOfUser">Object containing User's sid</param>
        /// <returns></returns>

        private static ManagementObject CreateTrustee(string domain, string userName, ManagementObject securityIdentifierOfUser)
        {
            ManagementObject trusteeObject = new ManagementClass("Win32_Trustee").CreateInstance();
            trusteeObject.Properties["Domain"].Value = domain;
            trusteeObject.Properties["Name"].Value = userName;
            tru


CHill60

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

Рейтинг:
1

Palash Mondal_

Ссылаться: Добавьте привилегию “все” в папку с помощью C#.NET[^]

DirectorySecurity sec = Directory.GetAccessControl(path);

// Using this instead of the "Everyone" string means we work on non-English systems.
SecurityIdentifier everyone = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
sec.AddAccessRule(new FileSystemAccessRule(everyone, FileSystemRights.Modify | FileSystemRights.Synchronize, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));
Directory.SetAccessControl(path, sec);


Надеюсь, это поможет!


Рейтинг:
0

phil.o

Вы устанавливаете ACL для папки, но не настраиваете общий ресурс для нее.

Кроме того, настройка списков доступа с отдельными учетными записями-это кошмар администратора. Лучше создать группу с соответствующими разрешениями и добавить пользователя в эту группу. Затем вам просто нужно установить ACL для группы, а не для отдельного человека. Если кто-то уходит и его разрешения должны быть отброшены, вам просто нужно удалить пользователя из группы.

Я не знаю, как создать общий ресурс из C#, кроме выполнения простой старой команды net share:

net share [share_name]=[path]

Вы можете получить дополнительную информацию о команде net share, набрав net share /? в консоли.