C # — Процесс.Start — использование глобальной переменной в качестве пароля — «не удается преобразовать из ‘string’ в ‘System.Безопасность.SecureString’

#c# #security #global-variables #process.start #securestring

#c# #Безопасность #глобальные переменные #process.start #securestring

Вопрос:

Я разработал форму входа и хотел, чтобы введенные имя пользователя и пароль сохранялись как переменные, которые я мог бы вызывать в других формах (общая программа представляет собой набор файлов .exe и сценариев powershell, которые я хочу запустить как имя пользователя и пароль, первоначально введенные в моей форме входа).

При запуске программы я создал «глобальные переменные», используя этот код:

 class usernameGlobalVariable
    {
        public static string var = "";
    }
    class passwordGlobalVariable
    {
        public static string var = "";
    }
  

В форме входа я сохранил имя пользователя и пароль, введенные в эти глобальные переменные таким образом:

 private void usernameTextBox_TextChanged(object sender, EventArgs e)
    {
        usernameGlobalVariable.var = usernameTextBox.Text;
    }


    private void passwordTextBox_TextChanged(object sender, EventArgs e)
    {
        passwordGlobalVariable.var = passwordTextBox.Text;
    }
  

Когда я хочу запустить процесс, я вызываю его, используя этот код (чтобы запустить его как имя пользователя и пароль, сохраненные в форме входа):

 string fileName = "c:\hdatools\Ping2.exe";
string arguments = "";
string domain = "vantage";
private void Button2_Click(object sender, EventArgs e)
    {

    Process.Start(
    fileName,
    arguments,
    usernameGlobalVariable.var,
    passwordGlobalVariable.var,
    domain);

    }
  

Основная ошибка, которую я получаю, находится в строке passwordGlobalVariable.var,
Ошибка гласит

Аргумент 4: невозможно преобразовать из ‘string’ в ‘System.Безопасность.SecureString’

Я пробовал разные способы попытаться преобразовать `passwordGlobalVariable.var’ в защищенную строку или передать другой строковой переменной ее содержимое, а затем отобразить эту переменную как защищенную строку. У меня наконец закончились идеи. Заранее спасибо за помощь.

Комментарии:

1. Почему вы используете зарезервированное ключевое слово для имени переменной? Это очень сбивает с толку и вводит в заблуждение. Пример, которому не следует следовать.

Ответ №1:

Аргумент 4: невозможно преобразовать из ‘string’ в ‘System.Безопасность.SecureString’

потому var что это a string , а не a SecureString , посмотрите:

 class passwordGlobalVariable
{
   public static string var = "";
}
  

Поэтому измените его на:

 class passwordGlobalVariable
{
   public static SecureString var;
}
  

И позже измените свой passwordTextBox_TextChanged обработчик событий, чтобы преобразовать ваш пароль string в SecureString :

 private void passwordTextBox_TextChanged(object sender, EventArgs e)
{
   SecureString passWord = new SecureString();
   foreach (char c in passwordTextBox.Text.ToCharArray())
   {
     passWord.AppendChar(c);
   }

    passwordGlobalVariable.var = passWord;
}
  

Небольшое примечание: воздержитесь от использования этого var слова, потому что его можно спутать с var контекстным ключевым словом C #.

Комментарии:

1. @Yair Nevet спасибо! к сожалению, ему не нравятся мои кавычки. Это подчеркивает мое «», и ошибка говорит, что невозможно неявно преобразовать тип ‘string в’System. Безопасность. SecureString’

2. @Yair Nevet еще раз спасибо — я изменил это, и это подчеркивает пароль в строке passwordGlobalVariable.var = passWord; Ошибка говорит ** Аргумент 4: невозможно преобразовать из ‘string’ в ‘System. Безопасность. SecureString’

3. @superKing в ваших структурах данных не должно быть строковых полей.

4. @YairNevet ты мужик! Это, безусловно, помогло, и я надеюсь, что другие смогут извлечь выгоду из этого ответа. Я бы проголосовал за это, если бы у меня было достаточно очков. По какой-то причине кто-то отклонил мой вопрос. Понятия не имею, почему… в любом случае, еще раз спасибо, приятель! : D

5. @asadali это не нужно, поскольку var является контекстным ключевым словом, а не полностью зарезервированным.

Ответ №2:

Приведенный ниже код создает SecureString из строки var:

    SecureString passWord = new SecureString();
   foreach (char c in var.ToCharArray())
                  passWord.AppendChar(c);
  

Комментарии:

1. спасибо (и извините, поскольку я новичок в кодировании), но создаст ли это новую переменную с именем passWord? Должен ли я использовать переменную passWord для хранения текста в поле пароля? Будет ли эта переменная доступна глобально? Еще раз спасибо

2. Вы можете продолжать использовать SecureString для хранения пароля.

Ответ №3:

 var secureUsername = new SecureString();
foreach (char c in usernameGlobalVariable.var)
{
    secureUsername.AppendChar(c);
}

var securePassword = new SecureString();
foreach (char c in passwordGlobalVariable.var)
{
    securePassword.AppendChar(c);
}
  

Это даст вам две строки безопасности, которые вы можете передать в процесс.Метод запуска

Комментарии:

1. спасибо — я пробовал это, но это подчеркивает, что var говорит, что пространство имен не может напрямую содержать такие элементы, как поля или методы . Он также подчеркивает SecureString и говорит ожидаемый класс, делегат, перечисление, интерфейс или структура

2. Process.Start перегрузки принимают только один SecureString , и это должен быть пароль, а не имя пользователя.