2010-01-28 46 views
1

我已经创建了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管理单元问题。

任何有识之士将不胜感激......

感谢,

布拉德

回答

0

你看到了什么,如果你改变你的工作()方法来做到这一点?

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)); 
} 
+0

第一行: WindowsPrincipal用户=(WindowsPrincipal)Thread.CurrentPrincipal中; 引发安全错误: 请求类型为“System.Security.Permissions.SecurityPermission,mscorlib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089”的权限失败。 – BLogan