WCF сервис самообслуживания, класс инсталлятора и netsh - PullRequest
14 голосов
/ 26 марта 2010

У меня есть приложение-служба WCF, которое я хочу развернуть с помощью пакета установщика msi. Конечная точка использует http-порт 8888. Чтобы запустить проект под Windows 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, которая работает под пользователем SYSTEM. Следовательно, Enviroment.UserName возвращает SYSTEM, а это не то, что я хочу.

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

1 Ответ

25 голосов
/ 26 марта 2010

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

    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 одинаков для всех локализаций окон. Метод Translate класса SecurityIdentifier возвращает локализованное имя учетной записи «Все».

...