2010-03-26 5 views
13

J'ai une application de service WCF auto-hébergée que je veux déployer par un paquet d'installation msi. Le terminal utilise le port http 8888. Pour démarrer le projet sous Windows 2008 après l'installation, je dois soit exécuter le programme en tant qu'administrateur ou doivent modifier les paramètres http avec netsh:Service WCF autogéré, classe d'installateur et netsh

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

Je veux modifier le http paramètres de ma classe d'installation. Je demande donc la méthode suivante à partir de la méthode d'installation():

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); 
    } 

Cette méthode fonctionne pour les versions anglaises de Windows, mais pas pour les versions localisées (Le groupe Tout le monde a des noms différents dans les versions localisées). J'ai également essayé d'utiliser Environment.UserName pour autoriser l'accès au moins pour l'utilisateur actuellement connecté. Mais cela ne fonctionne pas non plus, car la classe d'installation est exécutée par le service msi qui s'exécute sous l'utilisateur SYSTEM. Par conséquent Enviroment.UserName renvoie SYSTEM et ce n'est pas ce que je veux.

Y at-il un moyen d'accorder l'accès à tous (ou au moins pour l'utilisateur actuellement connecté) à mon service WCF auto-hébergé à partir d'une classe d'installation msi?

Répondre

24

Mon aproche à une solution:

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); 
    } 

Le SID "S-1-1-0" est un SID bien connu et représente le compte "Tout le monde". Le SID est le même pour toutes les localisations de fenêtres. La méthode Translate de classe SecurityIdentifier renvoie le nom localisé du compte Everyone.

+0

merci mon bonhomme, vous avez sauvé mon temps – Butsaty

+0

@kevinc Si vous faites référence à user = \, il ne l'est pas, car le @ en fait une chaîne verbatim. – Eternal21