#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
, и это должен быть пароль, а не имя пользователя.