c#
  • process
  • data-conversion
  • invalid-argument
  • 2017-10-03 2 views 0 likes 
    0

    System.Process에서 인수를 전달하여 netsh 명령을 실행하려고하는데 "매개 변수가 잘못되었습니다." 반환.잘못된 문자가 Process.StandardInput.WriteLine과 함께 전달되었습니다.

    통보 매개 변수는 다음과 같습니다

    HTTP 추가 sslcert의 ipport = 0.0.0.0 : {포트} certhash = {certificateHash} APPID = '{{00000000-0000-0000-0000-AABBCCDDEEFF}} ';

    여기서 port는 선택된 포트이며 certificate는 지정된 인증서의 해시를 해시합니다.

    나는 명령의 반환 추가 숨겨진 문자가 실현 (?)이 예제와 매개 변수 certhash에 대한 :

    C : \ WINDOWS \ system32를>은 netsh HTTP sslcert ipport 추가 = 0.0.0.0 : 8787 certhash = ?? BDBCA9543D50108B6F43AA44852CD1D0F4C07B7C appid = '{00000000-0000-0000-0000-AABBCCDDEEFF}' 매개 변수가 틀립니다.

    전달할 문자열을 강제로 전달할 수있는 방법이 있습니까? 나는 약간의 개종을 놓치고 있니?

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

    답변

    0

    그래서 언젠가 내 머리를 때리고 후, 난 다시 내 문자열을 확인하려고 :

    여기 내가 사용하는 코드입니다. 무슨 일이 있었는지, 처음에 내가 필요한 변경 메모장에 명령을 붙여 ++ 및 한 것이 었습니다 :

    netsh를 HTTP 추가를 sslcert ipport = 0.0.0.0 : {포트} certhash = {certificateHash} APPID = '{ 어떤 이상한 이유로 {00000000-0000-0000-0000-AABBCCDDEEFF}}

    그것은 certhash =의 끝 부분에 두 개의 숨겨진 문자를 추가하고, 그들이 추출하는 나의 방법으로 청소하거나 찾을 수 없습니다 그냥 문자열과 숫자.

    일반 메모장과 "유니 코드 문자 표시"옵션을 사용한 후 숨겨진 문자가 표시되었습니다. 멀리 떨어져서 나는 올바른 문자열을 다시 붙여 넣을 수 있었고 코드를 성공적으로 실행할 수있었습니다.

    관련 문제