WCF自主服务,安装程序类和netsh

Jel*_*rik 14 wcf windows-installer netsh

我有一个自我托管的WCF服务应用程序,我想通过msi安装程序包进行部署.端点使用http端口8888.为了在安装后在Windows 2008下启动项目,我必须以管理员身份运行程序或者必须使用netsh编辑http设置:

"netsh http add urlacl url=http://+:8888/ user=\Everyone"
Run Code Online (Sandbox Code Playgroud)

我想从我的安装程序类编辑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);
    }
Run Code Online (Sandbox Code Playgroud)

此方法适用于英语版本的Windows,但不适用于本地化版本(该组每个人在本地化版本中都有不同的名称).我还尝试使用Environment.UserName来允许至少为当前登录用户访问.但这也行不通,因为安装程序类由在用户SYSTEM下运行的msi服务运行.因此Enviroment.UserName返回SYSTEM,这不是我想要的.

有没有办法从msi安装程序类授予对我的自主WCF服务的所有(或至少是当前登录的)用户的访问权限?

Jel*_*rik 25

我的解决方案:

    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);
    }
Run Code Online (Sandbox Code Playgroud)

SID"S-1-1-0"是一个众所周知的SID,代表"Everyone"帐户.对于窗口的所有本地化,SID都是相同的.SecurityIdentifier类的Translate方法返回Everyone帐户的本地化名称.