Я работаю над приложением C#, которое заменяет explorer.exe
нашей собственной оболочкой. Мы хотим, чтобы пользователи могли разблокировать USB-накопители BitLocker из нашего пользовательского интерфейса.
Приложение C# периодически обновляет список дисков, подключенных к машине. Для каждого найденного диска он проверяет статус BDE, запуская Process
, который выполняет manage-bde -status
и анализирует вывод. Это работает нормально.
Проблема Разблокировка диска вызывает у меня проблему, так как
manage-bde -unlock <drive>: -password
является активной подсказкой, и мы не хотим, чтобы пользователь вообще видел открытую командную строку для ввода текста. Они заранее выберут имя диска и введут пароль в приложении C#.
У меня была идея создать файл .bat
в приложении C#, используя имя диска и пароль. Однако я не знаю правильного синтаксиса для отправки пароля (здесь .bat noob).
Мой (очень) батник WIP
@echo off
set driveName=F:
set pass=thePassword
manage-bde -unlock %driveName% -password
Как мне приступить к отправке переменной pass
? Я понимаю, что игра с паролями в виде обычного текста никоим образом не является безопасной, но самый важный вывод, который мне нужен, — это знать, как структурировать это в пакетном файле без пользовательского ввода в cmd.
Спасибо.
Почему вы используете командный файл /cmd.exe или сценарий powershell /powershell.exe? Я хотел бы знать, почему вы не можете запустить исполняемый файл с аргументами прямо из своего кода c#.
Возможно, я смогу запустить исполняемый файл из кода С#. Это просто решение, которое я придумал, потому что команды, казалось, делали то, что мне нужно.
Вы запускаете единственную программу с аргументами, нет необходимости в сценарии, использующем язык более низкого уровня, чтобы сделать это за вас.
Вы предлагаете мне программно выполнять операции BitLocker с помощью C#? Знаете ли вы какие-либо документы по этому поводу?
Нет, я предлагаю вам запустить manage-bde.exe
или manage-bde.wsf
, в зависимости от порядка вашего списка строк значений %PATHEXT%
, с аргументами из C#
вместо открытия пакетного файла из C#
, который, в свою очередь, откроет cmd окно (или открытие окна cmd.exe и вызов вашего командного файла в качестве аргумента для него), и в котором вы запускаете manage-bde
передачу ему двух аргументов.
Это возвращает меня к моей первоначальной проблеме, когда я не знал, как передавать аргументы в активное приглашение, такое как manage-bde -unlock
. Простой пример был бы бесполезен.
Вы пытались передать это в: Echo(%pass% | %SystemRoot%\System32\manage-bde.exe -unlock %driveName% -Password
? Или вы рассматривали возможность использования -RecoveryPassword
, который является вашим 48-значным ключом восстановления, или получить его из файла ключа вместо использования опции -RecoveryKey
? Проблема, похоже, в том, что вы ищете ответ о том, как использовать встроенную и хорошо документированную команду, а не о том, как исправить проблему с вашим кодом.
Компо, большое спасибо за ваши комментарии. Я попытался ввести пароль, как вы предложили, но получил ошибки. К тому времени я получил сценарий PowerShell, делающий то, что мне нужно. Я опубликую это как ответ. Только что мне сказали, что мы, вероятно, будем реорганизовывать все, чтобы вместо этого использовать USB-накопители с шифрованием Kanguru AES ... такова жизнь.
Получил решение сценария PowerShell для работы после опробования некоторых предложений (спасибо, Compo). Он решает проблему выполнения операций BitLocker без взаимодействия пользователя с командной строкой. Я понимаю, что есть более элегантные подходы.
public void ToggleBDELock(string driveLetter, string password )
{
string directory = @"C:\thePath\";
string scriptName = $"bdeunlock_{driveLetter}.ps1";
string scriptPath = Path.Combine( directory, scriptName );
string output;
FileStream fileStream;
// Set up location for the script.
// yada yada yada
// Write the script to the file.
fileStream = File.Create( scriptPath );
using( var writer = new StreamWriter( fileStream ) )
{
writer.WriteLine( $"$SecureString = ConvertTo-SecureString \"{password}\" -AsPlainText -Force" );
writer.WriteLine( $"Unlock-BitLocker -MountPoint \"{driveLetter}:\" -Password $SecureString" );
}
// Configure a process to run the script.
var startInfo = new ProcessStartInfo
{
FileName = "powershell.exe",
Arguments = $"-NoProfile -ExecutionPolicy unrestricted -file \"{scriptPath}\"",
UseShellExecute = false,
RedirectStandardOutput = true,
CreateNoWindow = true
};
// Try to execute the script.
using( var process = new Process { StartInfo = startInfo } )
{
try
{
process.Start();
output = process.StandardOutput.ReadToEnd();
}
catch( Exception e )
{
// yada yada yada
}
}
}
Собираюсь попробовать командлеты PowerShell для создания однострочника. Проверит обратно.