1) 保护参数配置
2) 注册表访问
using System.Security.Permissions; [RegistryPermissionAttribute(SecurityAction.PermitOnly, All = @"HKEY_LOCAL_MACHINESOFTWAREMicrosoftJet4.0EnginesJet 4.0")] private static void UpdateOS32RegisterItem() { using (RegistryKey currentKey = Registry.LocalMachine.OpenSubKey(@"SOFTWAREMicrosoftJet4.0EnginesJet 4.0", true)) { currentKey.SetValue("MaxLocksPerFile", 0xF4240, RegistryValueKind.DWord); currentKey.Close(); } }
该种写法混淆后会出现如下的错误:
解决方法:
添加 应用程序清单文件,在其中加入
<?xml version="1.0" encoding="utf-8"?> <asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> <security> <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> <!-- UAC 清单选项 如果希望更改 Windows 用户帐户控制级别,请用以下节点之一替换 requestedExecutionLevel 节点。 <requestedExecutionLevel level="asInvoker" uiAccess="false" /> <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> 如果您希望利用文件和注册表虚拟化提供 向后兼容性,请删除 requestedExecutionLevel 节点。 --> <requestedExecutionLevel level="asInvoker" uiAccess="false" /> <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> </requestedPrivileges> </security> </trustInfo> </asmv1:assembly>
修改代码,如下:
private static void UpdateOS32RegisterItem() { System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent(); System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal( identity ); if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator)) { using (RegistryKey currentKey = Registry.LocalMachine.OpenSubKey(@"SOFTWAREMicrosoftJet4.0EnginesJet 4.0", true)) { currentKey.SetValue("MaxLocksPerFile", 0xF4240, RegistryValueKind.DWord); currentKey.Close(); } } }