Разрешения на чтение общего ресурса в C#
Можно ли прочитать разрешения на совместное использование, назначенные общей папке? Я могу читать в локальных настройках безопасности программно (те, которые находятся под правой кнопкой мыши> Свойства> Безопасность) без проблем. Но мне интересно, как я могу прочитать разрешения под правой кнопкой мыши> Обмен и безопасность...> Разрешения
Вот изображение разрешений, которые я хочу прочитать:
Это возможно? Я использую машину XP Pro, если это поможет.
Редактировать:
Согласно моему ответу, я смог перебрать все общие ресурсы и получить доступ, который у вас (т. Е. У человека, запускающего программу) к этому общему ресурсу, но не нашел способа прочитать разрешения, которые другие имеют для этого общего ресурса. Это было сделано с использованием класса Win32_Share, однако у него нет возможности получить разрешения для общего доступа других пользователей. Если у кого-то есть полезные советы, это будет огромной помощью.
3 ответа
Я смог добиться этого, расширив подход, использованный Пити Б. Кроме того, убедитесь, что процесс, выполняющий этот код, олицетворяет привилегированного пользователя на сервере.
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());
}
}
}
}
}
Лучшее, что я могу придумать, - это итерация по всем общим ресурсам на машине и чтение разрешений, которые у вас есть для общего ресурса.
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";
}
}
Если бы кто-то мог понять, как получить разрешения, которые есть у других, то это было бы замечательно.
Я знаю, что вы можете с Windows Home Server: http://msdn.microsoft.com/en-us/library/bb425864.aspx
Вы можете сделать это в MMC, и большая часть этого доступна через код, поэтому это должно быть возможно. Если вы не можете найти его там, вы должны проверить вызовы API Windows. Я видел, как это делается в C++, поэтому это должно быть возможно и в C#. Извините, у меня нет примера кода или других ссылок, чтобы обеспечить их. Я посмотрю, смогу ли я выкопать немного, хотя.
Я также только что видел это на SO: как создать общую папку в C# с доступом только для чтения?
Другая хорошая ссылка: http://social.msdn.microsoft.com/Forums/en/windowssdk/thread/de213b61-dc7e-4f33-acdb-893aa96837fa