различное поведение агентов Azure Devops на размещенном VM, когда разные компьютеры получают доступ к VM - PullRequest
1 голос
/ 20 сентября 2019

Я использую агенты AzureDevops для выполнения задачи powershell в среде Cloud Hosted, задача очень проста, она создает рабочую книгу и сохраняет ее:

try{
    write-host 'initalized excel' 
    $Excel = New-Object -ComObject Excel.Application
    write-host 'adding WB'
    $Workbook = $Excel.Workbooks.Add()
    write-host 'Saving Wb'
    $Workbook.SaveAs('C:\test\test.xlsx')
 }
finally{
write-host 'quitting excel'
$Excel.quit()
}

Вот вывод задачи Devops:

##[section]Starting: PowerShell Script
==============================================================================
Task         : PowerShell
Description  : Run a PowerShell script on Linux, macOS, or Windows
Version      : 2.151.2
Author       : Microsoft Corporation
Help         : https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/powershell
==============================================================================
Generating script.
========================== Starting Command Output ===========================
##[command]"C:\windows\System32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command ". 'C:\agent\_work\_temp\33ed6d09-53ba-427a-a7ac-ea425a98767c.ps1'"
initalized excel
adding WB
quitting excel
Exception from HRESULT: 0x800A03EC
At C:\agent\_work\_temp\33ed6d09-53ba-427a-a7ac-ea425a98767c.ps1:6 char:5
+     $Workbook = $Excel.Workbooks.Add()
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], COMException
    + FullyQualifiedErrorId : System.Runtime.InteropServices.COMException

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

Когда я подключен к виртуальной машине с использованием RDP, он работает нормально:

##[section]Starting: PowerShell Script
==============================================================================
Task         : PowerShell
Description  : Run a PowerShell script on Linux, macOS, or Windows
Version      : 2.151.2
Author       : Microsoft Corporation
Help         : https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/powershell
==============================================================================
Generating script.
========================== Starting Command Output ===========================
##[command]"C:\windows\System32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command ". 'C:\agent\_work\_temp\436b2d56-2a41-4f75-97bb-01d4c41407e6.ps1'"
initalized excel
adding WB
Saving Wb
quitting excel
##[section]Finishing: PowerShell Script

Мой коллега и я RDP к виртуальномумашина с тем же пользователем.

Мы пробовали на другой виртуальной машине с другим агентом devops, возникает та же проблема.

Я немного потерян, и я не знаю, как устранить эту проблемувообще, также, если у вас есть какие-либо другие предложения для названия, я приму любой совет.

Редактировать:

Мы также попытались поместить этот скрипт в цикл и написать, если онуспешно или неудачно, когда я выполняю rdp на виртуальной машине, он работает, если я отключаю его, он работает, как только мой коллега RDP подключается к виртуальной машине, он начинает отказывать, если я снова подключаюсь (таким образом, отключаю моего коллегу), он снова работает.(Мы RDP с одним и тем же пользователем)

Edit2: я получаю предложение об изменении от того, кто заметил меня, что:

Из комментария пользователя-> ', когда агентуже запускает и создает файлы Excel в цикле, тот простой факт, что мой коллега по rdp для vm нарушает создание файла Excel. 'Эта проблема, кажется, не имеет ничего общего с лазурными девопами.Причина проблемы в том, что rdp

Что ж, это также проблема с лазурным агентом devops, поскольку простой запуск сценария вручную работает для нас обоих.Это проблема RDP, из-за которой агент Devops не может использовать некоторые функции excel-powershell, поэтому я думаю, что тег Azure Devops по-прежнему точен

1 Ответ

0 голосов
/ 29 сентября 2019

Запуск Excel в автоматическом автоматическом процессе (например, агент DevOps Azure) в неподдерживаемом режиме и может привести к различным проблемам , таким как те, с которыми вы столкнулись.

Официальная рекомендация - использовать сторонние компоненты, такие как Excel Package Plus (бесплатно) , NPOI (бесплатно) , SpreadSheetGear (коммерческий) или AsposeCells.NET (Коммерческая) .Или использовать System.IO.Packaging и для непосредственного редактирования XML-документа Office * .Они не зависят от того, установлен ли Excel на вашем сервере, на самом деле поддерживаются и не имеют всех видов проблем с лицензией, связанных с ними.Перенос ваших сценариев на эти другие типы пакетов часто не очень сложен, поскольку для переносимости они используют очень похожий API.

Помимо технических проблем, с которыми вы сталкиваетесь, лицензирование может быть даже более опасным, так как Officeне допускается автоматизация «от имени других пользователей» и, как правило, не допускается запуск на сервере.

Помимо технических проблем, вы также должны рассмотреть вопросы лицензирования.Действующие руководящие принципы лицензирования запрещают использование приложений Office на сервере для обслуживания клиентских запросов, если только эти клиенты не имеют лицензированных копий Office.Использование автоматизации на стороне сервера для обеспечения функциональности Office для нелицензированных рабочих станций не предусмотрено Лицензионным соглашением с конечным пользователем (EULA).

https://support.microsoft.com/en-us/help/257757/considerations-for-server-side-automation-of-office

Возможно, вы сможетечтобы решить некоторые из проблем, например ту, которую вы испытываете сейчас, но вы, скорее всего, столкнетесь с новыми.Интерактивный запуск агента Azure DevOps может помочь, в этом случае Excel будет также запускаться в интерактивном сеансе вместо защищенного скрытого сеанса пользователя без реального рабочего стола.Вероятно, происходит то, что второй пользователь, подключающийся через RDP, закрывает все другие сеансы при входе в систему или блокирует все сеансы при выходе из системы.

Вот риски безопасности, когда вы включаете автоматический вход илиотключите экранную заставку, потому что вы позволяете другим пользователям подходить к компьютеру и использовать учетную запись, которая автоматически входит в систему.Если вы настраиваете агент для работы таким образом, вы должны убедиться, что компьютер физически защищен;например, расположенный в безопасном объекте.Если вы используете удаленный рабочий стол для доступа к компьютеру, на котором работает агент с автоматическим входом в систему, простое закрытие удаленного рабочего стола приводит к блокировке компьютера, и любые тесты пользовательского интерфейса, которые запускаются на этом агенте, могут завершиться неудачей.Чтобы избежать этого, используйте команду tscon для отключения от удаленного рабочего стола.Например:

 %windir%\System32\tscon.exe 1 /dest:console

https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/agents?view=azure-devops#interactive-or-service

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


Чтобы запустить агент в интерактивном режиме, настройте подачу на автоматический вход в систему ( эта утилита зашифровывает используемые учетные данные ) и добавляет run.cmd впапка агента в списке запускаемых файлов (либо в реестре, либо в ярлыке в меню «Пуск» ). Вы также можете сделать исполняемый файл агента (c:\windows\system32\cmd.exe /c path\to\agent\run.cmd) оболочкой по умолчанию . Существует довольно много документов по настройке пользовательской оболочки .

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

И вы должны быть уверены, что всегда отключаете сеанс удаленного рабочего стола, не блокируя его (как описано выше).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...