Новый домен приложений из оснастки MMC не получает повышенных привилегий для UAC - PullRequest
1 голос
/ 28 января 2010

Я создал оснастку 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.

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

Спасибо,

Бред

1 Ответ

0 голосов
/ 28 января 2010

Что вы увидите, если для этого измените метод 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));
}
...