2017-10-03 4 views
0

J'essaie d'exécuter une commande netsh en utilisant System.Process en passant un argument et j'obtiens un "Le paramètre est incorrect". revenir.Les caractères non valides sont passés avec Process.StandardInput.WriteLine

Le paramètre est informé:

http ajouter sslcert ipport = 0.0.0.0: {port} certhash = {} certificateHash appid = '{{00000000-0000-0000-0000-AABBCCDDEEFF}} ';

Où port est le port sélectionné et certificateHash le hachage du certificat spécifié.

j'ai réalisé que le retour de la commande a des caractères supplémentaires cachés (??) pour le paramètre certhash comme cet exemple:

C: \ Windows \ system32> netsh http ajouter sslcert ipport = 0.0.0.0: 8787 certhash =? BDBCA9543D50108B6F43AA44852CD1D0F4C07B7C appid = '{00000000-0000-0000-0000-AABBCCDDEEFF}' Le paramètre est incorrect.

Existe-t-il un moyen de forcer la chaîne de l'argument à être exactement celle que je passe? Ai-je manqué une conversion?

Voici le code que je utilise:

public static void RegisterCertificateToSslPort(string subjectName) 
{ 
     var store = new X509Store(StoreName.Root, StoreLocation.CurrentUser); 
     store.Open(OpenFlags.ReadOnly); 

     var certificate = store.Certificates.Find(X509FindType.FindBySubjectName, subjectName, true); 

     var certificateHash = CleanThumbprint(certificate[0]?.GetCertHashString()); 

     var result = CommandExecuter.AddSslCertificateToPort(certificateHash, "8787"); 
} 


public static string CleanThumbprint(string mmcThumbprint) 
{ 
     return new string(mmcThumbprint.Where(c => char.IsLetter(c) || char.IsDigit(c)).ToArray()); 
} 

private static string Execute(string command) 
{ 
     var startInfo = 
      new System.Diagnostics.ProcessStartInfo 
      { 
       WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden, 
       FileName = "cmd.exe", 
       Verb = "runas", 
       UseShellExecute = false, 
       RedirectStandardInput = true, 
       RedirectStandardOutput = true, 
       WorkingDirectory = @"C:\Windows\system32" 
      }; 

     var standardOutput = new StringBuilder(); 

     using (var process = System.Diagnostics.Process.Start(startInfo)) 
     { 
      using (var sw = process?.StandardInput) 
      { 
       if (sw != null && sw.BaseStream.CanWrite) 
       { 
        sw.WriteLine(command); 
       } 
      } 

      while (process != null && !process.HasExited) 
      { 
       standardOutput.Append(process.StandardOutput.ReadToEnd()); 
      } 

      standardOutput.Append(process?.StandardOutput.ReadToEnd()); 
     } 

     return standardOutput.ToString(); 
} 

public static string AddSslCertificateToPort(string certificateHash, string port, string appId = null) 
{ 
     var command = 
      $"netsh http add sslcert ipport=0.0.0.0:{port} certhash=‎‎{certificateHash} appid='{{00000000-0000-0000-0000-AABBCCDDEEFF}}'"; 

     return Execute(command); 
} 

Répondre

0

Alors après avoir battu ma tête pendant un certain temps, j'ai essayé de vérifier à nouveau mes cordes. Qu'est-il arrivé, est que tout d'abord, je collais la commande à Notepad ++ et fait les changements nécessaires:

netsh http ajouter sslcert ipport = 0.0.0.0: {port} certhash = {} certificateHash appid = '{ {00000000-0000-0000-0000-AABBCCDDEEFF}}

pour une raison étrange ajouter les deux personnages cachés à la fin de certhash =, et ils ne sont pas nettoyées ou trouvé par ma méthode pour extraire juste des ficelles et des chiffres. Après avoir utilisé le bloc-notes ordinaire et les options «Afficher les caractères Unicode», les caractères cachés ont été affichés. Avec eux loin, je pouvais simplement coller à nouveau la bonne chaîne et les exécuter avec succès le code.