Подтвердить что ты не робот

WCF для самообслуживания, класс установщика и netsh

У меня есть самозанятое приложение службы WCF, которое я хочу развернуть с помощью установочного пакета msi. Конечная точка использует http-порт 8888. Чтобы запустить проект под окнами 2008 после установки, мне нужно либо запустить программу как администратор, либо отредактировать настройки http с помощью netsh:

"netsh http add urlacl url=http://+:8888/ user=\Everyone"

Я хочу изменить настройки http из моего класса установщика. Поэтому я вызываю следующий метод из метода Install():

    public void ModifyHttpSettings()
    {
        string parameter = @"http add urlacl url=http://+:8888/ user=\Everyone";

        System.Diagnostics.ProcessStartInfo psi =
            new System.Diagnostics.ProcessStartInfo("netsh", parameter);

        psi.Verb = "runas";
        psi.RedirectStandardOutput = false;
        psi.CreateNoWindow = true;
        psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
        psi.UseShellExecute = false;
        System.Diagnostics.Process.Start(psi);
    }

Этот метод будет работать для английских версий окон, но не для локализованных версий (группа. У всех разные имена в локализованных версиях). Я также попытался использовать Environment.UserName, чтобы разрешить доступ, по крайней мере, для текущего зарегистрированного пользователя. Но это также не работает, потому что класс установщика запускается службой msi, которая работает под пользовательской системой. Следовательно, Enviroment.UserName возвращает SYSTEM, и это не то, что я хочу.

Есть ли способ предоставить доступ ко всем (или, по крайней мере, для текущего пользователя), к моей самоходной службе WCF из класса установщика msi?

4b9b3361

Ответ 1

Мой подход к решению:

    public void ModifyHttpSettings()
    {
        string everyone = new System.Security.Principal.SecurityIdentifier(
            "S-1-1-0").Translate(typeof(System.Security.Principal.NTAccount)).ToString();

        string parameter = @"http add urlacl url=http://+:8888/ user=\" + everyone;

        ProcessStartInfo psi = new ProcessStartInfo("netsh", parameter);

        psi.Verb = "runas";
        psi.RedirectStandardOutput = false;
        psi.CreateNoWindow = true;
        psi.WindowStyle = ProcessWindowStyle.Hidden;
        psi.UseShellExecute = false;
        Process.Start(psi);
    }

SID "S-1-1-0" является известным SID и обозначает учетную запись "Все". SID одинаково для всех локализаций окон. Метод "Передать класс SecurityIdentifier" возвращает локализованное имя учетной записи "Все".