Новый AppDomain из MMC Snap-In не получает повышенных привилегий для UAC

Я создал оснастку MMC, которая запускает код в новом домене приложения, и часть кода проверяет ключ реестра. Если я проверяю ключ в моментальном процессе, он работает, но код в новом домене приложения вызывает исключение безопасности. Если я загружаю код в новый домен приложения из консоли или приложения Windows, он работает нормально.

Вот код:

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, он работает нормально. Я думаю, что это скорее вопрос оснастки MMC, чем вопрос UAC.

Любое понимание будет высоко оценено ...

Спасибо,

Брэд


person BLogan    schedule 28.01.2010    source источник


Ответы (1)


Что вы увидите, если измените свой метод Work(), чтобы сделать это?

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));
}
person Bryan Batchelder    schedule 28.01.2010
comment
Первая строка: WindowsPrincipal user = (WindowsPrincipal)Thread.CurrentPrincipal; Выдает ошибку безопасности: запрос на разрешение типа «System.Security.Permissions.SecurityPermission, mscorlib, версия = 2.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089» не удалось. - person BLogan; 28.01.2010