Подтвердить что ты не робот

Автоматическое получение лицензии разработчика для тестирования устройств Windows Store на сервере сборки

Для приложений Windows Store для запуска модульных тестов требуется лицензия разработчика, что отлично подходит для отдельного разработчика на его персональной машине.

Но для непрерывного процесса интеграции на сервере сборки нам действительно нужна возможность автоматически приобретать лицензию.

Microsoft предоставляет инструмент командной строки, но он по-прежнему создает интерактивное окно, которое прерывает процесс.

TailoredDeploy.exe AcquireDeveloperLicense

Знает ли кто-нибудь другой способ автоматически получить лицензию разработчика? Создание новых узлов сборки будет адом, если ему потребуется ручная настройка через. VPN для каждого из них.

4b9b3361

Ответ 1

Мне было предложено использовать "Автоматизация пользовательского интерфейса" , и вот что я довел до сих пор:

using System.Diagnostics;
using System.Threading;
using System.Windows.Automation;

class Program
{
    static void Main(string[] args)
    {
        var processStartInfo = new ProcessStartInfo(@"C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\TailoredDeploy.exe", "AcquireDeveloperLicense");

        var process = Process.Start(processStartInfo);
        process.WaitForInputIdle();

        Thread.Sleep(1000);

        var agreementWindow = AutomationElement.RootElement.FindFirst(TreeScope.Children,
            new PropertyCondition(AutomationElement.ProcessIdProperty, process.Id));

        var iAgreeButton = agreementWindow.FindAll(TreeScope.Children, Condition.TrueCondition)[0]
                                          .FindAll(TreeScope.Children, Condition.TrueCondition)[2];

        var buttonPattern = iAgreeButton.GetCurrentPattern(AutomationPattern.LookupById(InvokePattern.Pattern.Id)) as InvokePattern;
        buttonPattern.Invoke();

        Thread.Sleep(10000);

        var processes = Process.GetProcessesByName("dllhost");

        var credentialsWindows = AutomationElement.RootElement.FindAll(TreeScope.Children,
            new PropertyCondition(AutomationElement.ProcessIdProperty, processes[0].Id));

        if (credentialsWindows[0].Current.Name == "Developer License")
        {
            var credentialsPane = credentialsWindows[0].FindAll(TreeScope.Children, Condition.TrueCondition)[0]
                                                       .FindAll(TreeScope.Children, Condition.TrueCondition)[0]
                                                       .FindAll(TreeScope.Children, Condition.TrueCondition)[0]
                                                       .FindAll(TreeScope.Children, Condition.TrueCondition)[0]
                                                       .FindAll(TreeScope.Children, Condition.TrueCondition);

            var usernameTextBox = credentialsPane[3].GetCurrentPattern(AutomationPattern.LookupById(ValuePattern.Pattern.Id)) as ValuePattern;
            usernameTextBox.SetValue("[email protected]");

            var passwordTextBox = credentialsPane[5].GetCurrentPattern(AutomationPattern.LookupById(ValuePattern.Pattern.Id)) as ValuePattern;
            passwordTextBox.SetValue("password");

            var loginButton = credentialsPane[8].GetCurrentPattern(AutomationPattern.LookupById(InvokePattern.Pattern.Id)) as InvokePattern;
            loginButton.Invoke();

            Thread.Sleep(10000);

            var finishUpProcesses = Process.GetProcessesByName("TailoredDeploy");

            var finishWindow = AutomationElement.RootElement.FindFirst(TreeScope.Children,
                new PropertyCondition(AutomationElement.ProcessIdProperty, finishUpProcesses[0].Id));

            var lastItems = finishWindow.FindAll(TreeScope.Children, Condition.TrueCondition)[0]
                                        .FindAll(TreeScope.Children, Condition.TrueCondition);

            var closeButton = lastItems[3].GetCurrentPattern(AutomationPattern.LookupById(InvokePattern.Pattern.Id)) as InvokePattern;
            closeButton.Invoke();
        }
    }
}

Чтобы использовать это, требуется app.manifest для работы в повышенном режиме:

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
      </requestedPrivileges>
    </security>
  </trustInfo>
  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
    </application>
  </compatibility>
</asmv1:assembly>