Я сохраняю свою информацию SMB Share на диск, чтобы я мог восстановить ее позже при необходимости.
Для этого я использую класс MSFT_SMB .Я получаю все общие ресурсы SMB на своем локальном компьютере и сохраняю данные на диск.Дескриптор безопасности, полученный следующим образом, в строковом формате.
Это код, который получает все общие ресурсы:
private const string SmbNamespace = "\\\\.\\ROOT\\Microsoft\\Windows\\SMB";
private const string SmbShareClass = "MSFT_SmbShare";
private const string CreateShareMethod = "CreateShare";
private const string GetShareMethod = "GetShare";
public virtual List<SmbShareInfo> GetAllSmbShares()
{
ManagementClass SmbShares = new ManagementClass(SmbNamespace + ":" + SmbShareClass);
List<SmbShareInfo> sharesPresent = new List<SmbShareInfo>();
try
{
foreach (ManagementObject smbObject in SmbShares.GetInstances())
{
sharesPresent.Add(constructSmbShareInfo(smbObject));
}
return sharesPresent;
}
catch (ManagementException e)
{
throw new Exception(e.ToString());
}
}
private SmbShareInfo constructSmbShareInfo(ManagementObject smbObject)
{
return new SmbShareInfo(
Convert.ToString(smbObject["Name"]),
Convert.ToString(smbObject["Path"]),
Convert.ToString(smbObject["Description"]),
Convert.ToBoolean(smbObject["Special"]),
Convert.ToUInt32(smbObject["ConcurrentUserLimit"]),
Convert.ToString(smbObject["SecurityDescriptor"]),
Convert.ToUInt32(smbObject["ShareType"]),
Convert.ToUInt32(smbObject["FolderEnumerationMode"]),
Convert.ToBoolean(smbObject["EncryptData"]),
Convert.ToUInt32(smbObject["CachingMode"]));
}
Где SmbShareInfo
- это класс, который я определил для хранения общего ресурса SMB.информация локально
Теперь, когда я пытаюсь снова создать общий ресурс (на новом компьютере с Windows), метод CreateShare ожидает «Имя дескриптора безопасности общего ресурса».
Как получить «имя» дескриптора безопасности и создать общий ресурс?У меня просто есть строковые дескрипторы безопасности, такие как:
O:SYG:SYD:(A;;GA;;;BA)(A;;GA;;;BO)(A;;GA;;;IU)
Это мой код для создания общего ресурса:
ManagementObject managementObject = new ManagementClass(SmbNamespace + ":" + SmbShareClass);
managementObject.Get();
string[] accountNames = { "Everyone" };
ManagementBaseObject createShareInParameters = managementObject.GetMethodParameters(CreateShareMethod);
createShareInParameters["Name"] = fileShare.Name;
createShareInParameters["Path"] = fileShare.Path;
createShareInParameters["Description"] = fileShare.Description;
createShareInParameters["ConcurrentUserLimit"] = fileShare.ConcurrentUserLimit;
// Enable this
//createShareInParameters["SecurityDescriptor"] = fileShare.SecurityDescriptor;
createShareInParameters["FolderEnumerationMode"] = fileShare.FolderEnumerationMode;
createShareInParameters["EncryptData"] = fileShare.EncryptData;
createShareInParameters["CachingMode"] = fileShare.CachingMode;
createShareInParameters["FullAccess"] = accountNames;
managementObject.InvokeMethod(CreateShareMethod, createShareInParameters, null);