[英]How to set permissions to all users on a new share folder , by c# code?
如何通過C#代碼為新共享文件夾上的所有用戶設置權限? 這是我添加共享文件夾的代碼:
public static string sharedFolder()
{
try
{
// create a directory
Directory.CreateDirectory(@"C:\MyTestShare");
// Create a ManagementClass object
ManagementClass managementClass = new ManagementClass("Win32_Share");
// Create ManagementBaseObjects for in and out parameters
ManagementBaseObject inParams = managementClass.GetMethodParameters("Create");
ManagementBaseObject outParams;
// Set the input parameters
inParams["Description"] = "My Files Share";
inParams["Name"] = "My Files Share";
inParams["Path"] = @"C:\MyTestShare";
inParams["Type"] = 0x0; // Disk Drive
// Invoke the method on the ManagementClass object
//InvokeMethodOptions _invokeMethodOptions=new InvokeMethodOptions.InfiniteTimeout.h
outParams = managementClass.InvokeMethod("Create", inParams,null);
setPermissionsToShareFolder(inParams["Path"].ToString());
// AddDirectorySecurity(inParams["Path"].ToString());
// Check to see if the method invocation was successful
if ((uint)(outParams.Properties["ReturnValue"].Value) != 0)
{
return ("Unable to share directory.");
}
return ("Able to share directory.");
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
我也一直在搜索,並且主要發現諸如此類的未解決問題。
這是我在不同位置找到的所有代碼片段編寫的代碼:
public static void CreateSharedFolder(string FolderPath, string ShareName, string Description)
{
try
{
// Create a ManagementClass object
ManagementClass managementClass = new ManagementClass("Win32_Share");
// Create ManagementBaseObjects for in and out parameters
ManagementBaseObject inParams = managementClass.GetMethodParameters("Create");
ManagementBaseObject outParams;
// Set the input parameters
inParams["Description"] = Description;
inParams["Name"] = ShareName;
inParams["Path"] = FolderPath;
inParams["Type"] = 0x0; // Disk Drive
//Another Type:
// DISK_DRIVE = 0x0
// PRINT_QUEUE = 0x1
// DEVICE = 0x2
// IPC = 0x3
// DISK_DRIVE_ADMIN = 0x80000000
// PRINT_QUEUE_ADMIN = 0x80000001
// DEVICE_ADMIN = 0x80000002
// IPC_ADMIN = 0x8000003
//inParams["MaximumAllowed"] = 2;
inParams["Password"] = null;
NTAccount everyoneAccount = new NTAccount(null, "EVERYONE");
SecurityIdentifier sid = (SecurityIdentifier)everyoneAccount.Translate(typeof(SecurityIdentifier));
byte[] sidArray = new byte[sid.BinaryLength];
sid.GetBinaryForm(sidArray, 0);
ManagementObject everyone = new ManagementClass("Win32_Trustee");
everyone["Domain"] = null;
everyone["Name"] = "EVERYONE";
everyone["SID"] = sidArray;
ManagementObject dacl = new ManagementClass("Win32_Ace");
dacl["AccessMask"] = 2032127;
dacl["AceFlags"] = 3;
dacl["AceType"] = 0;
dacl["Trustee"] = everyone;
ManagementObject securityDescriptor = new ManagementClass("Win32_SecurityDescriptor");
securityDescriptor["ControlFlags"] = 4; //SE_DACL_PRESENT
securityDescriptor["DACL"] = new object[] { dacl };
inParams["Access"] = securityDescriptor;
// Invoke the "create" method on the ManagementClass object
outParams = managementClass.InvokeMethod("Create", inParams, null);
// Check to see if the method invocation was successful
var result = (uint)(outParams.Properties["ReturnValue"].Value);
switch (result)
{
case 0:
Console.WriteLine("Folder successfuly shared.");
break;
case 2:
Console.WriteLine("Access Denied");
break;
case 8:
Console.WriteLine("Unknown Failure");
break;
case 9:
Console.WriteLine("Invalid Name");
break;
case 10:
Console.WriteLine("Invalid Level");
break;
case 21:
Console.WriteLine("Invalid Parameter");
break;
case 22:
Console.WriteLine("Duplicate Share");
break;
case 23:
Console.WriteLine("Redirected Path");
break;
case 24:
Console.WriteLine("Unknown Device or Directory");
break;
case 25:
Console.WriteLine("Net Name Not Found");
break;
default:
Console.WriteLine("Folder cannot be shared.");
break;
}
}
catch (Exception ex)
{
Console.WriteLine("Error:" + ex.Message);
}
}
internal static void RemoveSharedFolder(string ShareName)
{
try
{
// Create a ManagementClass object
ManagementClass managementClass = new ManagementClass("Win32_Share");
ManagementObjectCollection shares = managementClass.GetInstances();
foreach (ManagementObject share in shares)
{
if (Convert.ToString(share["Name"]).Equals(ShareName))
{
var result = share.InvokeMethod("Delete", new object[] { });
// Check to see if the method invocation was successful
if (Convert.ToInt32(result) != 0)
{
Console.WriteLine("Unable to unshare directory.");
}
else
{
Console.WriteLine("Folder successfuly unshared.");
}
break;
}
}
}
catch (Exception ex)
{
Console.WriteLine("Error:" + ex.Message);
}
}
“ FolderPath”必須存在。
我假設您對everyone
的描述都是“所有用戶”。
參量
訪問[輸入]
用戶級別權限的安全描述符。 安全描述符包含有關資源的權限,所有者和訪問功能的信息。 如果未提供此參數或該參數為NULL,則每個人都具有對dhare的讀取權限。 有關更多信息,請參見Win32_SecurityDescriptor和更改安全對象上的訪問安全性。
否則,根據MSDN - Chaning訪問安全性的安全對象 ,你需要使用Win32_LogicalShareSecuritySetting
類與SetSecurityDescriptor
MSDN上描述的方法- 在Win32_LogicalShareSecuritySetting類SetSecurityDescriptor方法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.