Разблокируйте диск BitLocker с помощью пакетного файла, созданного в приложении C#

Я работаю над приложением 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.

Спасибо.

Собираюсь попробовать командлеты PowerShell для создания однострочника. Проверит обратно.

JBest 23.12.2020 20:36

Почему вы используете командный файл /cmd.exe или сценарий powershell /powershell.exe? Я хотел бы знать, почему вы не можете запустить исполняемый файл с аргументами прямо из своего кода c#.

Compo 23.12.2020 22:31

Возможно, я смогу запустить исполняемый файл из кода С#. Это просто решение, которое я придумал, потому что команды, казалось, делали то, что мне нужно.

JBest 29.12.2020 15:16

Вы запускаете единственную программу с аргументами, нет необходимости в сценарии, использующем язык более низкого уровня, чтобы сделать это за вас.

Compo 29.12.2020 15:19

Вы предлагаете мне программно выполнять операции BitLocker с помощью C#? Знаете ли вы какие-либо документы по этому поводу?

JBest 29.12.2020 15:23

Нет, я предлагаю вам запустить manage-bde.exe или manage-bde.wsf, в зависимости от порядка вашего списка строк значений %PATHEXT%, с аргументами из C# вместо открытия пакетного файла из C#, который, в свою очередь, откроет cmd окно (или открытие окна cmd.exe и вызов вашего командного файла в качестве аргумента для него), и в котором вы запускаете manage-bde передачу ему двух аргументов.

Compo 29.12.2020 16:13

Это возвращает меня к моей первоначальной проблеме, когда я не знал, как передавать аргументы в активное приглашение, такое как manage-bde -unlock. Простой пример был бы бесполезен.

JBest 29.12.2020 16:28

Вы пытались передать это в: Echo(%pass% | %SystemRoot%\System32\manage-bde.exe -unlock %driveName% -Password? Или вы рассматривали возможность использования -RecoveryPassword, который является вашим 48-значным ключом восстановления, или получить его из файла ключа вместо использования опции -RecoveryKey? Проблема, похоже, в том, что вы ищете ответ о том, как использовать встроенную и хорошо документированную команду, а не о том, как исправить проблему с вашим кодом.

Compo 29.12.2020 16:48

Компо, большое спасибо за ваши комментарии. Я попытался ввести пароль, как вы предложили, но получил ошибки. К тому времени я получил сценарий PowerShell, делающий то, что мне нужно. Я опубликую это как ответ. Только что мне сказали, что мы, вероятно, будем реорганизовывать все, чтобы вместо этого использовать USB-накопители с шифрованием Kanguru AES ... такова жизнь.

JBest 29.12.2020 18:41
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
9
1 111
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Получил решение сценария 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
                }
            }
        }

Другие вопросы по теме