Введите пароль автоматически для подключения RDP (CredentialUIBroker) - PullRequest
1 голос
/ 02 апреля 2020

В качестве упражнения я пытаюсь автоматизировать ввод учетных данных RDP с помощью FlaUI. Моя ОС Windows 10.

Я могу запустить msts c .exe и ввести в это окно:

mstsc window

Но затем я получаю это окно и нигде не могу его найти:

Credential Manager UI Host window

Это не окно msts c, хотя он появляется над ним как модальное окно: msts c всегда имеет только одно окно. Очевидно, это окно «Хоста пользовательского интерфейса диспетчера учетных данных», но этот процесс имеет ... ноль windows.

Даже в диспетчере задач он указан в фоновых задачах, а не в разделе приложений. FlaUI Inspect его вообще не видит.

Кстати, это мой код:

var CurrentAutomation = new UIA3Automation();
var Process = Application.Attach(Process.GetProcessesByName("CredentialUIBroker")[0]);
var Windows = Process.GetAllTopLevelWindows(CurrentAutomation); // 0 elements

Как я могу получить дескриптор этого окна и получить доступ к его текстовому полю с помощью FlaUI?

1 Ответ

2 голосов
/ 02 апреля 2020

Оказывается, это был просто вопрос знания названия «окна», которое называется Credential Dialog Xaml Host; Кроме того, его можно найти с помощью FlaUI Inspect.

После завершения части msts c и появления окна "Windows Security" вы можете go включить с этим примером кода:

// 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...