/// <summary> /// 设置磁盘权限 /// </summary> /// <param name="driveInfo">磁盘信息</param> /// <param name="diskPermission">磁盘权限</param> /// <param name="errMsg">[OUT]错误信息</param> /// <returns>设置结果</returns> public static bool CF_SetPermission(DriveInfo driveInfo, ModDiskPermission diskPermission, out string errMsg) { if (!driveInfo.IsReady) { errMsg = "驱动器未准备好"; return(false); } if (driveInfo.DriveType != DriveType.Removable) { errMsg = $"不支持的驱动器类型: {driveInfo.DriveType.ToString()}"; return(false); } if (CF_IsExistPermission(driveInfo)) { errMsg = "磁盘已设置权限"; return(false); } if (string.IsNullOrEmpty(diskPermission.VerificationContent)) { errMsg = "验证内容为空"; return(false); } try { string content = diskPermission.VerificationContent; //序列号控制 if (diskPermission.EnableSerialNumberControl) { string serialNumber = GetSerialNumber(driveInfo); if (string.IsNullOrEmpty(serialNumber)) { errMsg = "磁盘序列号获取失败"; return(false); } ModAESParameter modAESParameter = new ModAESParameter() { Key = serialNumber }; if (!AESEncrypt.CF_EncryptString(modAESParameter, content, out content, out errMsg)) { errMsg = $"验证内容加密失败: {errMsg}"; return(false); } } //型号控制 if (diskPermission.EnableModelControl) { string model = GetModel(driveInfo); if (string.IsNullOrEmpty(model)) { errMsg = "磁盘型号获取失败"; return(false); } ModAESParameter modAESParameter = new ModAESParameter() { Key = model }; if (!AESEncrypt.CF_EncryptString(modAESParameter, content, out content, out errMsg)) { errMsg = $"验证内容加密失败: {errMsg}"; return(false); } } //创建文件夹 Directory.CreateDirectory(Path.Combine(driveInfo.Name, m_ControlFolderPath)); //卷标名控制 if (diskPermission.EnableVolumeLabelControl) { string volumeLabel = driveInfo.VolumeLabel; if (!AESEncrypt.CF_EncryptString(new ModAESParameter(), volumeLabel, out volumeLabel, out errMsg)) { errMsg = $"卷标名加密失败: {errMsg}"; return(false); } FileInfo vlFile = new FileInfo(Path.Combine(driveInfo.Name, m_VolumeLabelFilePath)); if (vlFile.Exists) { vlFile.Attributes = FileAttributes.Normal; } File.WriteAllText(vlFile.FullName, volumeLabel); vlFile.Attributes = FileAttributes.ReadOnly | FileAttributes.Hidden | FileAttributes.System; driveInfo.VolumeLabel = diskPermission.VolumeLabel; if (driveInfo.VolumeLabel != diskPermission.VolumeLabel) { errMsg = "卷标名太长,或包含无效字符"; return(false); } } FileInfo cFile = new FileInfo(Path.Combine(driveInfo.Name, m_ControlFilePath)); if (cFile.Exists) { cFile.Attributes = FileAttributes.Normal; } File.WriteAllText(cFile.FullName, content); cFile.Attributes = FileAttributes.ReadOnly | FileAttributes.Hidden | FileAttributes.System; DirectoryInfo cFolder = new DirectoryInfo(Path.Combine(driveInfo.Name, m_ControlFolderPath)); cFolder.Attributes = FileAttributes.ReadOnly | FileAttributes.Hidden | FileAttributes.System; } catch (Exception ex) { errMsg = ex.Message; return(false); } errMsg = ""; return(true); }
/// <summary> /// 检查磁盘权限 /// </summary> /// <param name="diskPermission">磁盘权限</param> /// <param name="errMsg">[OUT]错误信息</param> /// <returns>检查结果</returns> public static bool CF_CheckPermission(ModDiskPermission diskPermission, out string errMsg) { errMsg = "未授权"; foreach (DriveInfo driveInfo in DriveInfo.GetDrives()) { //磁盘状态判断 if (!driveInfo.IsReady || driveInfo.DriveType != DriveType.Removable) { continue; } //权限设置判断 if (!CF_IsExistPermission(driveInfo)) { continue; } //卷标名判断 if (diskPermission.EnableVolumeLabelControl && driveInfo.VolumeLabel != diskPermission.VolumeLabel) { continue; } //获取验证内容 string content = File.ReadAllText(Path.Combine(driveInfo.Name, m_ControlFilePath)); //型号控制 if (diskPermission.EnableModelControl) { string model = GetModel(driveInfo); if (string.IsNullOrEmpty(model)) { errMsg = "磁盘型号获取失败"; continue; } ModAESParameter modAESParameter = new ModAESParameter() { Key = model }; if (!AESEncrypt.CF_DecryptString(modAESParameter, content, out content, out errMsg)) { errMsg = $"验证内容解密失败: {errMsg}"; continue; } } //序列号控制 if (diskPermission.EnableSerialNumberControl) { string serialNumber = GetSerialNumber(driveInfo); if (string.IsNullOrEmpty(serialNumber)) { errMsg = "磁盘序列号获取失败"; continue; } ModAESParameter modAESParameter = new ModAESParameter() { Key = serialNumber }; if (!AESEncrypt.CF_DecryptString(modAESParameter, content, out content, out errMsg)) { errMsg = $"验证内容加密失败: {errMsg}"; continue; } } if (content == diskPermission.VerificationContent) { errMsg = ""; break; } } return(string.IsNullOrEmpty(errMsg)); }