从MMC管理单元中的新AppDomain不会获得UAC的提升权限
问题描述:
我已经创建了MMC管理单元,该管理单元在新的AppDomain中启动代码,并且部分代码检查注册表项。如果我在快速入门过程中检查密钥,它会起作用,但新AppDomain中的代码会引发安全异常。如果我从控制台或Windows应用程序加载新的appdomain中的代码,它工作正常。从MMC管理单元中的新AppDomain不会获得UAC的提升权限
下面是代码:
public class SimpleMMCSnapIn : SnapIn
{
public SimpleMMCSnapIn()
{
RegistryKey archerKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft", true); //this call works
Evidence baseEv = AppDomain.CurrentDomain.Evidence;
Evidence newEv = new Evidence(baseEv);
AppDomainSetup setup = new AppDomainSetup { ApplicationBase = "<pathtobin>" };
AppDomain domain = AppDomain.CreateDomain("MigratorDomain", newEv, setup);
domain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
IWork migrator = (IWork)domain.CreateInstanceAndUnwrap("CheckRegistry", "CheckRegistry.CheckRegistry");
migrator.Work();
}
}
[Serializable]
public class CheckRegistry : MarshalByRefObject, IWork
{
public void Work()
{
RegistryKey archerKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft", true); //this call throws a security exception
}
}
请注意,如果我从一个控制台或Windows应用程序新的AppDomain中加载代码,它工作正常。我认为这是一个比UAC问题更多的MMC管理单元问题。
任何有识之士将不胜感激......
感谢,
布拉德
答
你看到了什么,如果你改变你的工作()方法来做到这一点?
WindowsPrincipal user = (WindowsPrincipal)Thread.CurrentPrincipal;
if (user.IsInRole(WindowsBuiltInRole.Administrator))
{
MessageBox.Show(string.Format("{0} is an Administrator", user.Identity.Name));
}
else
{
MessageBox.Show(string.Format("{0} is NOT an Administrator", user.Identity.Name));
}
第一行: WindowsPrincipal用户=(WindowsPrincipal)Thread.CurrentPrincipal中; 引发安全错误: 请求类型为“System.Security.Permissions.SecurityPermission,mscorlib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089”的权限失败。 – BLogan