C#通过WMI设置NTFS目录共享和目录安全

1) 目录共享:通过WMI的Win32_Share类的Create()方法来实现。
2) 目录安全:通过WMI的Win32_LogicalFileSecuritySetting类的SetSecurityDescriptor()方法来实现,涉及到win32_trustee和win32_ace类。

完整代码 如下:

using  System;
using  System.Collections.Generic;
using  System.ComponentModel;
using  System.Data;
using  System.Drawing;
using  System.Text;
using  System.Windows.Forms;
using  System.Management;

namespace  SharePermissions
{
    
public enum ShareResourceType : uint
    
{
        DiskDrive 
= 0x0,
        PrintQueue 
= 0x1,
        Device 
= 0x2,
        IPC 
= 0x3,
        DiskDriveAdmin 
= 0x80000000,
        PrintQueueAdmin 
= 0x80000001,
        DeviceAdmin 
= 0x80000002,
        IPCAdmin 
= 0x80000003
    }


    [Flags]
    
public enum AccessPrivileges : uint
    
{
        FileReadData 
= 0x00000001,
        FileWriteData 
= 0x00000002,
        FileAppendData 
= 0x00000004,
        FileReadEA 
= 0x00000008,
        FileWriteEA 
= 0x00000010,
        FileExecute 
= 0x00000020,
        FileDeleteChild 
= 0x00000040,
        FileReadAttributes 
= 0x00000080,
        FileWriteAttributes 
= 0x00000100,
        Delete 
= 0x00010000,
        ReadControl 
= 0x00020000,
        WriteDac 
= 0x00040000,
        WriteOwner 
= 0x00080000,
        Synchronize 
= 0x00100000
    }


    [Flags]
    
enum AceFlags : uint
    
{
        NonInheritAce 
= 0,
        ObjectInheritAce 
= 1,
        ContainerInheritAce 
= 2,
        NoPropagateInheritAce 
= 4,
        InheritOnlyAce 
= 8,
        InheritedAce 
= 16
    }


    [Flags]
    
enum AceType : uint
    
{
        AccessAllowed 
= 0,
        AccessDenied 
= 1,
        Audit 
= 2
    }


    
public partial class Form1 : Form
    
{
        
public Form1()
        
{
            InitializeComponent();
        }


        
private void Form1_Load(object sender, EventArgs e)
        
{
            SetShares();
            SetPermissions();
        }


        
void SetShares()
        
{
            ManagementClass mc 
= new ManagementClass("win32_share");
            ManagementBaseObject inParams 
= mc.GetMethodParameters("Create");
            inParams[
"Path"= @"C:DownloadsTemp";
            inParams[
"Name"= "Temp";
            inParams[
"Type"= ShareResourceType.DiskDrive;
            inParams[
"MaximumAllowed"= null;      //null = 用户数连接无限制,否则指定一个正整数
            inParams["Description"= null;
            inParams[
"Password"= null;
            inParams[
"Access"= null//null = 使Everyone拥有完全控制权限

            ManagementBaseObject outParams 
= mc.InvokeMethod("Create", inParams, null);
            
uint returnValue = (uint)outParams.Properties["ReturnValue"].Value;
            
string ErrorMessage = null;
            
switch (returnValue)
            
{
                
case 0//Success
                    break;
                
case 2//Access denied 
                    ErrorMessage = "无权访问";
                    
break;
                
case 8//Unknown failure 
                    ErrorMessage = "未知失败";
                    
break;
                
case 9//Invalid name 
                    ErrorMessage = "非法的共享名";
                    
break;
                
case 10//Invalid level 
                    ErrorMessage = "非法的层次";
                    
break;
                
case 21//Invalid parameter 
                    ErrorMessage = "非法的参数";
                    
break;
                
case 22//Duplicate share
                    ErrorMessage = "重复共享";
                    
break;
                
case 23//Redirected path 
                    ErrorMessage = "重定向路径";
                    
break;
                
case 24//Unknown device or directory 
                    ErrorMessage = "未知的目录";
                    
break;
                
case 25//Net name not found 
                    ErrorMessage = "网络名不存在";
                    
break;
                
default:
                    
break;
            }

            
if (returnValue == 0)
                MessageBox.Show(
"成功");
            
else
                MessageBox.Show(ErrorMessage);
        }


        
bool SetPermissions()
        
{
            
//ManagementPath path = new ManagementPath();
            
//path.Server = ".";              // 机器名, .表示本机
            
//path.NamespacePath = @"rootcimv2";
            
//path.RelativePath = string.Format("Win32_LogicalFileSecuritySetting.Path='{0}'", @"C:DownloadsTemp");
            
//ManagementObject mo = new ManagementObject(path);

            ManagementObject mo 
= new ManagementObject(string.Format("Win32_LogicalFileSecuritySetting.Path='{0}'"@"C:DownloadsTemp"));
            ManagementBaseObject outParams 
= mo.InvokeMethod("GetSecurityDescriptor"nullnull);

            
if ((uint)outParams.Properties["ReturnValue"].Value != 0)
                
return false;
            ManagementBaseObject Descriptor 
= (ManagementBaseObject)outParams.Properties["Descriptor"].Value;
            
//foreach (ManagementBaseObject mbo in (ManagementBaseObject[])Descriptor.Properties["Dacl"].Value)
            
//{
            
//    this.richTextBox1.AppendText(string.Format("AccessMask: {0} AceFlags:{1} AceType: {2} ", mbo["AccessMask"],
            
//        Enum.Format(typeof(AceFlags), mbo["AceFlags"], "g"), mbo["AceType"]));

            
//    if ((uint)mbo["AceType"] == (uint)AceType.AccessDenied)
            
//        this.richTextBox1.AppendText("Denied Ace ");
            
//    else
            
//        this.richTextBox1.AppendText("Allowed Ace ");

            
//    ManagementBaseObject Trustee = ((ManagementBaseObject)(mbo["Trustee"]));
            
//    this.richTextBox1.AppendText(string.Format("Name: {0} Domain: {1} SID: {2} ",
            
//        Trustee.Properties["Name"].Value,
            
//        Trustee.Properties["Domain"].Value,
            
//        Trustee.Properties["SIDString"].Value));

            
//    uint mask = (UInt32)mbo["AccessMask"];
            
//    this.richTextBox1.AppendText(Enum.Format(typeof(AccessPrivileges), mask, "g"));
            
//    this.richTextBox1.AppendText(" ");
            
//}


            List
<ManagementBaseObject> newDacl = new List<ManagementBaseObject>();
            
//newDacl.AddRange((ManagementBaseObject[])Descriptor.Properties["Dacl"].Value);

            
//增加Everyone用户
            ManagementClass trustee = new ManagementClass("win32_trustee");
            trustee.Properties[
"Name"].Value = "Everyone";
            trustee.Properties[
"Domain"].Value = null;

            
//设置只读/运行权限
            ManagementClass ace = new ManagementClass("win32_ace");
            ace.Properties[
"AccessMask"].Value = AccessPrivileges.FileReadData | AccessPrivileges.FileReadAttributes | AccessPrivileges.FileReadEA
                
| AccessPrivileges.ReadControl | AccessPrivileges.FileExecute;
            ace.Properties[
"AceFlags"].Value = AceFlags.ObjectInheritAce | AceFlags.ContainerInheritAce | AceFlags.NoPropagateInheritAce;
            ace.Properties[
"AceType"].Value = AceType.AccessAllowed;
            ace.Properties[
"Trustee"].Value = trustee;
            newDacl.Add(ace);

            ManagementBaseObject inParams 
= mo.GetMethodParameters("SetSecurityDescriptor");
            Descriptor.Properties[
"Dacl"].Value = newDacl.ToArray();
            
//Descriptor.Properties["Group"].Value = null;
            
//Descriptor.Properties["Owner"].Value = null;

            inParams[
"Descriptor"= Descriptor;
            ManagementBaseObject ret 
= mo.InvokeMethod("SetSecurityDescriptor", inParams, null);

            
uint returnValue = (uint)ret.Properties["ReturnValue"].Value;
            
string ErrorMessage = null;
            
switch (returnValue)
            
{
                
case 0//Success
                    break;
                
case 2//Access denied 
                    ErrorMessage = "无权访问";
                    
break;
                
case 8//Unknown failure 
                    ErrorMessage = "未知失败";
                    
break;
                
case 9//Privilege missing 
                    ErrorMessage = "缺少权限";
                    
break;
                
case 21//Invalid parameter 
                    ErrorMessage = "非法的参数";
                    
break;
                
default:
                    
break;
            }

            
if (returnValue == 0)
            
{
                MessageBox.Show(
"成功");
                
return true;
            }

            
else
            
{
                MessageBox.Show(ErrorMessage);
                
return false;
            }

        }

    }

}



另外需要注意的是:当新建目录时,系统会从上级目录自动继承用户,这些用户可能有完全控制权限,当你对某个目录设置只读时,可能由于这些继承用户的存在而影响到最终结果。所以要将根目录(如C:/, d:/等)的目录属性的安全页中将一些系统自动添加的具有完全控制的用户(如Creator Owner, Users, System)删除或改为非继承或仅当前目录有效。
注:根目录的Everyone不会被继承(可以通过目录属性的安全/高级/编辑中看到),另外也不要把本机管理员或域管理员(都是Administrator)误删了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C#中获取WMI共享文件夹的物理目录是通过查询Win32_Share类来实现的。以下是一个实现的示例代码: 首先,您需要进行以下引用: ```csharp using System.Management; ``` 然后,您可以使用以下代码来获取WMI共享文件夹的物理路径: ```csharp public static string GetSharedFolderPath(string shareName) { string folderPath = ""; ManagementScope scope = new ManagementScope(); try { // 连接WMI命名空间 scope.Connect(); ObjectQuery query = new ObjectQuery($"SELECT Path FROM Win32_Share WHERE Name = '{shareName}'"); ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query); ManagementObjectCollection sharedFolders = searcher.Get(); foreach (ManagementObject sharedFolder in sharedFolders) { folderPath = sharedFolder["Path"].ToString(); break; // 如果只有一个共享文件夹,您可以删除这一行 } } catch (ManagementException ex) { // 处理异常 Console.WriteLine("An error occurred while querying WMI: " + ex.Message); } return folderPath; } ``` 您可以调用此方法并传递共享文件夹的名称参数,例如: ```csharp string sharedFolderPath = GetSharedFolderPath("ShareName"); Console.WriteLine("Shared folder path: " + sharedFolderPath); ``` 此代码将返回共享文件夹的物理路径,并将其打印到控制台。如果有多个具有相同名称的共享文件夹,该代码将仅返回第一个找到的共享文件夹的物理路径。 请注意,您需要具有适当的权限才能查询WMI。如果遇到权限问题,请确保您的应用程序以管理员权限运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值