Разрешения на чтение общего ресурса в C # - PullRequest
3 голосов
/ 03 июня 2011

Можно ли прочитать разрешения на совместное использование, назначенные для общей папки?Я могу читать в локальных настройках безопасности программно (те, которые находятся под правой кнопкой мыши> Свойства> Безопасность) без проблем.Но мне интересно, как я могу прочитать разрешения в разделе Правый клик> Общий доступ и безопасность ...> Разрешения

Вот изображение разрешений, которые я хочу прочитать:

Share Permissions

Возможно ли это?Я использую компьютер XP Pro, если это поможет.

Редактировать:

Согласно моему ответу, я смог перебрать все ресурсы и получить доступ you (т. е. тот, у кого запущена программа) имеет этот общий ресурс, но не нашел способа прочитать разрешения, которые другие имеют для этого общего ресурса.Это было сделано с использованием класса Win32_Share , однако у него нет опции для получения прав доступа других пользователей.Если у кого-нибудь есть полезные советы, это очень поможет.

Ответы [ 3 ]

8 голосов
/ 05 сентября 2012

Я смог добиться этого, расширив подход, использованный Пити Б. Кроме того, убедитесь, что процесс, выполняющий этот код, олицетворяет привилегированного пользователя на сервере.

    using System;
    using System.Management;

    ...

    private static void ShareSecurity(string ServerName)
    {
        ConnectionOptions myConnectionOptions = new  ConnectionOptions();

        myConnectionOptions.Impersonation = ImpersonationLevel.Impersonate;            
        myConnectionOptions.Authentication = AuthenticationLevel.Packet;

        ManagementScope myManagementScope = 
            new ManagementScope(@"\\" + ServerName + @"\root\cimv2", myConnectionOptions);

        myManagementScope.Connect();

        if (!myManagementScope.IsConnected)
            Console.WriteLine("could not connect");
        else
        {
            ManagementObjectSearcher myObjectSearcher = 
                new ManagementObjectSearcher(myManagementScope.Path.ToString(), "SELECT * FROM Win32_LogicalShareSecuritySetting");

            foreach(ManagementObject share in myObjectSearcher.Get())
            {
                Console.WriteLine(share["Name"] as string);
                InvokeMethodOptions options = new InvokeMethodOptions();
                ManagementBaseObject outParamsMthd = share.InvokeMethod("GetSecurityDescriptor", null, options);
                ManagementBaseObject descriptor = outParamsMthd["Descriptor"] as ManagementBaseObject;
                ManagementBaseObject[] dacl =  descriptor["DACL"] as ManagementBaseObject[];                  

                foreach (ManagementBaseObject ace in dacl)
                {
                    try
                    {
                        ManagementBaseObject trustee = ace["Trustee"] as ManagementBaseObject;
                        Console.WriteLine(
                            trustee["Domain"] as string + @"\" + trustee["Name"] as string + ": " +
                            ace["AccessMask"] as string + " " + ace["AceType"] as string
                        );                            
                    }
                    catch (Exception error)
                    {
                        Console.WriteLine("Error: "+ error.ToString());
                    }
                }
            }               
        }
    }
2 голосов
/ 03 июня 2011

Лучшее, что я могу придумать, - это итерация по всем общим ресурсам на машине и чтение разрешений , которые у вас есть для общего ресурса.

ManagementClass manClass = new ManagementClass(@"\\" +computerName +@"\root\cimv2:Win32_Share"); //get shares

//run through all the shares
foreach (ManagementObject objShare in manClass.GetInstances())
{
  //ignore system shares
  if (!objShare.Properties["Name"].Value.ToString().Contains('$'))
  {
    //print out the share name and location
    textBox2.Text += String.Format("Share Name: {0}  Share Location: {1}", objShare.Properties["Name"].Value, objShare.Properties["Path"].Value) + "\n";

    Int32 permissions = 0;

    try
    {
      //get the access values you have
      ManagementBaseObject result = objShare.InvokeMethod("GetAccessMask", null, null);

      //value meanings: http://msdn.microsoft.com/en-us/library/aa390438(v=vs.85).aspx
      permissions = Convert.ToInt32(result.Properties["ReturnValue"].Value);
    }
    catch (ManagementException me)
    {
      permissions = -1; //no permissions are set on the share
    }

    textBox2.Text += "You have permissions: " + permissions + "\n\n";

  }
}

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

2 голосов
/ 03 июня 2011

Я знаю, что вы можете с Windows Home Server: http://msdn.microsoft.com/en-us/library/bb425864.aspx

Вы можете сделать это в MMC, и большая часть этого доступна через код, поэтому это должно быть возможно.Если вы не можете найти его там, вы должны проверить вызовы API Windows.Я видел, как это делается в C ++, поэтому это должно быть возможно и в C #.Извините, у меня нет примера кода или других ссылок для их предоставления.Я посмотрю, смогу ли я выкопать что-нибудь.Еще одна хорошая ссылка: http://social.msdn.microsoft.com/Forums/en/windowssdk/thread/de213b61-dc7e-4f33-acdb-893aa96837fa

...