Member 10948185
Запустите его от имени администратора. Добавьте файл манифеста в свой проект.
Метод ShareFolder создает каталог и совместно использует его, но разрешение общего доступа доступно только для чтения. Чтобы изменить это разрешение, мы вызовем метод SetPermission.
Добавить ссылку на System.Management.dll
using System;
using System.Management;
using System.IO;
public string ShareFolder(string FolderPath, string ShareName, string Description)
{
string strSharePath = FolderPath;
string strShareName = ShareName;
string strShareDesc = Description;
string msg = string.Empty;
try
{
Directory.CreateDirectory(strSharePath);
ManagementClass oManagementClass = new ManagementClass("Win32_Share");
ManagementBaseObject inputParameters = oManagementClass.GetMethodParameters("Create");
ManagementBaseObject outputParameters;
inputParameters["Description"] = strShareDesc;
inputParameters["Name"] = strShareName;
inputParameters["Path"] = strSharePath;
inputParameters["Type"] = 0x0;//disk drive
inputParameters["MaximumAllowed"] = null;
inputParameters["Access"] = null;
inputParameters["Password"] = null;
outputParameters = oManagementClass.InvokeMethod("Create", inputParameters, null);
if ((uint)(outputParameters.Properties["ReturnValue"].Value) != 0)
{
msg = "There is a problem while sharing the directory.";
throw new Exception("There is a problem while sharing the directory.");
}
else
{
msg = ("Share Folder has been created with the name :" + strShareName);
}
}
catch (Exception ex)
{
msg = (ex.Message.ToString());
}
return msg;
}
Этот метод установит разрешение.
Получить Системный Домен.
string Domain = Environment.UserDomainName;
В методе AddPermission передайте sharedFolderName то же самое, что и shareName, заданное вами в предыдущем методе, или общее имя каталога, для которого вы хотите изменить разрешение. В поле Имя пользователя укажите имя учетной записи, для которой вы хотите установить/изменить разрешение. Пример - все, администраторы и т.д.
using System;
using System.Management;
using System.Globalization;
public void AddPermissions(string sharedFolderName, string domain, string userName)
{
// Step 1 - Getting the user Account Object
ManagementObject sharedFolder = GetSharedFolderObject(sharedFolderName);
if (sharedFolder == null)
{
System.Diagnostics.Trace.WriteLine("The shared folder with given name does not exist");
return;
}
ManagementBaseObject securityDescriptorObject = sharedFolder.InvokeMethod("GetSecurityDescriptor", null, null);
if (securityDescriptorObject == null)
{
System.Diagnostics.Trace.WriteLine(string.Format(CultureInfo.InvariantCulture, "Error extracting security descriptor of the shared path {0}.", sharedFolderName));
return;
}
int returnCode = Convert.ToInt32(securityDescriptorObject.Properties["ReturnValue"].Value);
if (returnCode != 0)
{
System.Diagnostics.Trace.WriteLine(string.Format(CultureInfo.InvariantCulture, "Error extracting security descriptor of the shared path {0}. Error Code{1}.", sharedFolderName, returnCode.ToString()));
return;
}
ManagementBaseObject securityDescriptor = securityDescriptorObject.Properties["Descriptor"].Value as ManagementBaseObject;
// Step 2 -- Extract Access Control List from the security descriptor
int existingAcessControlEntriesCount = 0;
ManagementBaseObject[] accessControlList = securityDescriptor.Properties["DACL"].Value as ManagementBaseObject[];
if (accessControlList == null)
{
// If there aren't any entries in access control list or the list is empty - create one
accessControlList = new ManagementBaseObject[1];
}
else
{
// Otherwise, resize the list to allow for all new users.
existingAcessControlEntriesCount = accessControlList.Length;
Array.Resize(ref accessControlList, accessControlList.Length + 1);
}
// Step 3 - Getting the user Account Object
ManagementObject userAccountObject = GetUserAccountObject(domain, userName);
ManagementObject securityIdentfierObject = new ManagementObject(string.Format("Win32_SID.SID='{0}'", (string)userAccountObject.Properties["SID"].Value));
securityIdentfierObject.Get();
// Step 4 - Create Trustee Object
ManagementObject trusteeObject = CreateTrustee(domain, userName, securityIdentfierObject);
// Step 5 - Create Access Control Entry
ManagementObject accessControlEntry = CreateAccessControlEntry(trusteeObject, false);
// Step 6 - Add Access Control Entry to the Access Control List
accessControlList[existingAcessControlEntriesCount] = accessControlEntry;
// Step 7 - Assign access Control list to security desciptor
securityDescriptor.Properties["DACL"].Value = accessControlList;
// Step 8 - Assign access Control list to security desciptor
ManagementBaseObject parameterForSetSecurityDescriptor = sharedFolder.GetMethodParameters("SetSecurityDescriptor");
parameterForSetSecurityDescriptor["Descriptor"] = securityDescriptor;
sharedFolder.InvokeMethod("SetSecurityDescriptor", parameterForSetSecurityDescriptor, null);
}
/// <summary>
/// The method returns ManagementObject object for the shared folder with given name
/// </summary>
/// <param name="sharedFolderName">string containing name of shared folder</param>
/// <returns>Object of type ManagementObject for the shared folder.</returns>
private static ManagementObject GetSharedFolderObject(string sharedFolderName)
{
ManagementObject sharedFolderObject = null;
//Creating a searcher object to search
ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * from Win32_LogicalShareSecuritySetting where Name = '" + sharedFolderName + "'");
ManagementObjectCollection resultOfSearch = searcher.Get();
if (resultOfSearch.Count > 0)
{
//The search might return a number of objects with same shared name. I assume there is just going to be one
foreach (ManagementObject sharedFolder in resultOfSearch)
{
sharedFolderObject = sharedFolder;
break;
}
}
return sharedFolderObject;
}
/// <summary>
/// The method returns ManagementObject object for the user folder with given name
/// </summary>
/// <param name="domain">string containing domain name of user </param>
/// <param name="alias">string containing the user's network name </param>
/// <returns>Object of type ManagementObject for the user folder.</returns>
private static ManagementObject GetUserAccountObject(string domain, string alias)
{
ManagementObject userAccountObject = null;
ManagementObjectSearcher searcher = new ManagementObjectSearcher(string.Format("select * from Win32_Account where Name = '{0}' and Domain='{1}'", alias, domain));
ManagementObjectCollection resultOfSearch = searcher.Get();
if (resultOfSearch.Count > 0)
{
foreach (ManagementObject userAccount in resultOfSearch)
{
userAccountObject = userAccount;
break;
}
}
return userAccountObject;
}
/// <summary>
/// Returns the Security Identifier Sid of the given user
/// </summary>
/// <param name="userAccountObject">The user object who's Sid needs to be returned</param>
/// <returns></returns>
private static ManagementObject GetAccountSecurityIdentifier(ManagementBaseObject userAccountObject)
{
ManagementObject securityIdentfierObject = new ManagementObject(string.Format("Win32_SID.SID='{0}'", (string)userAccountObject.Properties["SID"].Value));
securityIdentfierObject.Get();
return securityIdentfierObject;
}
/// <summary>
/// Create a trustee object for the given user
/// </summary>
/// <param name="domain">name of domain</param>
/// <param name="userName">the network name of the user</param>
/// <param name="securityIdentifierOfUser">Object containing User's sid</param>
/// <returns></returns>
private static ManagementObject CreateTrustee(string domain, string userName, ManagementObject securityIdentifierOfUser)
{
ManagementObject trusteeObject = new ManagementClass("Win32_Trustee").CreateInstance();
trusteeObject.Properties["Domain"].Value = domain;
trusteeObject.Properties["Name"].Value = userName;
tru