Недопустимые символы, переданные с помощью Process.StandardInput.WriteLine.

Я пытаюсь выполнить команду netsh, используя System.Process, передавая аргумент, и получаю сообщение «Неверный параметр». вернуть.

Сообщается параметр:

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

Где port — это выбранный порт, а certificateHash — хэш указанного сертификата.

Я понял, что в возврате команды есть дополнительные скрытые символы (??) для параметра certhash, как в этом примере:

C:\Windows\system32>netsh http add 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);
}

person geanito    schedule 03.10.2017    source источник


Ответы (1)


Так что после того, как я немного побил головой, я снова попытался проверить свои струны. Что произошло, так это то, что сначала я вставил команду в Notepad++ и сделал необходимые изменения:

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

По какой-то странной причине он добавляет два скрытых символа в конец certhash=, и они не были очищены или найдены моим методом для извлечения только строк и чисел.

После использования обычного блокнота и опции "Показать символы Юникода" отображались скрытые символы. Без них я смог просто снова вставить нужную строку, и они успешно запустили код.

person geanito    schedule 10.10.2017