Автоматический ввод пароля для RDP-соединения (CredentialUIBroker)
В качестве упражнения я пытаюсь автоматизировать ввод учетных данных RDP с помощью FlaUI. Моя ОС - Windows 10.
Я могу запустить mstsc.exe и ввести в это окно:
Но тут у меня появляется вот такое окно и нигде его не найти:
Это не окно mstsc, хотя оно отображается над ним как модальное окно: mstsc всегда имеет только одно окно. По-видимому, это окно "Узел пользовательского интерфейса диспетчера учетных данных", но у этого процесса... нет окон.
Даже в диспетчере задач он указан в фоновых задачах, а не в разделе приложений. FlaUI Inspect его вообще не видит.
Кстати, это мой код:
var CurrentAutomation = new UIA3Automation();
var Process = Application.Attach(Process.GetProcessesByName("CredentialUIBroker")[0]);
var Windows = Process.GetAllTopLevelWindows(CurrentAutomation); // 0 elements
Как мне получить дескриптор этого окна и получить доступ к его текстовому полю с помощью FlaUI?
1 ответ
Оказывается, нужно было просто знать имя "окна", которым является узел Xaml диалога учетных данных; также его можно найти с помощью FlaUI Inspect.
После того, как часть mstsc будет завершена и появится окно "Безопасность Windows", вы можете продолжить с этим примером кода:
// Declare all variables, which might be method parameters instead
var Password = "MyLamePassword";
var MaxTimeout = new TimeSpan(10 * 1000 * 2000);
var CurrentAutomation = new UIA3Automation();
var Desktop = CurrentAutomation.GetDesktop();
// Get the window, using a Retry call to wait for it to be available
var CredentialWindow = Retry
.WhileEmpty(
() => Desktop.FindAllDescendants(f => f.ByClassName("Credential Dialog Xaml Host")),
timeout: MaxTimeout,
throwOnTimeout: true)
.Result[0];
// Get the password box
AutomationElement PasswordBox = null;
Retry.WhileNull(
() => PasswordBox = CredentialWindow.FindFirstDescendant(f => f.ByName("Password").And(f.ByControlType(ControlType.Edit))),
timeout: MaxTimeout,
throwOnTimeout: true);
// Type the password
PasswordBox.FocusNative();
Keyboard.Type(Password);
// I have some Retry code here too, just to check that the password is actually typed, and type Enter after it.
CurrentAutomation.Dispose();