2011-06-03 47 views
3

是否可以读取分配给共享文件夹的共享权限?我能够读取本地安全设置programmaticaly(在右键单击>属性>安全性下找到的)没有问题。但是,我不知道我怎么能读下右击>共享和安全权限...>权限阅读C#中的共享权限

这里是权限的形象我想读:

Share Permissions

是这可能吗?如果有帮助,我正在运行XP Pro机器。

编辑:

按我的回答,我能够通过全部股份进行迭代,并获得访问(即运行程序的人)对这一份额,但还没有找到一种方法阅读权限其他人拥有该份额。这是使用Win32_Share类完成的,但它没有获取其他用户的共享权限的选项。如果任何人有任何有用的提示,这将是一个巨大的帮助。

回答

2

我知道你可以使用Windows Home Server的: http://msdn.microsoft.com/en-us/library/bb425864.aspx

可以在MMC做到这一点,大部分是可以通过代码,因此它应该是可能的。如果你在那里找不到它,那么你应该检查Windows API调用。我已经看到它在C++中完成,所以它应该也可以在C#中使用。对不起,我没有任何示例代码或其他链接提供这些。我会看看我是否可以挖掘一些。

我也只是看到了这对SO: how to create shared folder in C# with read only access?

另一个很好的链接: http://social.msdn.microsoft.com/Forums/en/windowssdk/thread/de213b61-dc7e-4f33-acdb-893aa96837fa

+0

感谢您的信息。运行Windows XP时可以参考Microsoft.HomeServer.SDK.Interop.v1吗? – 2011-06-03 15:01:58

+0

我不知道答案,但我不这么认为。只要看看其他链接,他们应该给你足够的信息来完成你的任务。 – 2011-06-03 17:04:41

+0

谢谢,我是abe按照我的回答收集每个共享上的权限 – 2011-06-03 19:25:00

2

我能想出通过全部股份迭代的机器上,并读取权限你最好的分享上有

ManagementClass manClass = new ManagementClass(@"\\" +computerName [email protected]"\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"; 

    } 
} 

如果有人可以弄清楚如何获得别人对共享的权限,那将是惊人的。

7

我能够通过扩展Petey B采取的方法来实现这一目标。另外,请确保运行此代码的进程模拟服务器上的特权用户。

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()); 
        } 
       } 
      }    
     } 
    }