WCF сервис самообслуживания, класс инсталлятора и netsh
У меня есть приложение-служба 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 ответ
Мой подход к решению:
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 возвращает локализованное имя учетной записи "Все".