当另一台计算机访问虚拟机时,Azure Devops代理在托管虚拟机上的不同行为

时间:2019-09-20 15:35:11

标签: excel powershell azure-devops remote-desktop

编辑:经过大量测试,我们设法找到了机器之间的共同点,当使用RDP连接到我们的环境时,这些共同点打破了由天蓝色开发者启动的powershell脚本调用的excel功能的执行。 agent:所有这些机器都有触摸屏,没有触摸屏的机器不会损坏它(尝试过3台带有触摸屏的机器,不同的构造函数和4台没有触摸屏的机器)

编辑2:禁用触摸屏并使用RDP连接到计算机时,不再破坏脚本

我正在使用AzureDevops代理在Cloud Hosted环境上执行Powershell任务,该任务非常简单,只需创建一个工作簿并保存它即可:

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 Task的输出:

##[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   虚拟机中断了excel文件的创建。”这个问题似乎有   与天蓝色的发展无关。该问题的原因是由于   rdp

嗯,这也是一个天蓝色的devops代理问题,因为简单地手动运行脚本对我们俩都有效。这是一个RDP问题,导致Devops代理无法使用某些excel-powershell函数,因此我认为Azure Devops标记仍然准确

编辑:

  

在finally块中,尝试输出带有以下内容的完整错误堆栈:$ Error   |格式列表-强制– HAL9256

这是错误:

Exception             : System.Runtime.InteropServices.COMException (0x800706BE): The remote procedure call failed. 
                        (Exception from HRESULT: 0x800706BE)
                           at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, 
                        IntPtr errorInfo)
                           at System.Management.Automation.ComInterop.ComRuntimeHelpers.CheckThrowException(Int32 
                        hresult, ExcepInfo& excepInfo, ComMethodDesc method, Object[] args, UInt32 argErr)
                           at CallSite.Target(Closure , CallSite , ComObject )
                           at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)
                           at CallSite.Target(Closure , CallSite , Object )
                           at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)
                           at System.Management.Automation.Interpreter.DynamicInstruction`2.Run(InterpretedFrame frame)
                           at 
                        System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame 
                        frame)
TargetObject          : 
CategoryInfo          : OperationStopped: (:) [], COMException
FullyQualifiedErrorId : System.Runtime.InteropServices.COMException
ErrorDetails          : 
InvocationInfo        : System.Management.Automation.InvocationInfo
ScriptStackTrace      : at <ScriptBlock>, C:\agent\_work\_temp\fae3ef7a-700d-49c1-8f1f-7f7d2bc0d49e.ps1: line 8
                        at <ScriptBlock>, <No file>: line 1
PipelineIterationInfo : {}
PSMessageDetails      : 

2 个答案:

答案 0 :(得分:2)

Running Excel under an automated, unattended process (such as an Azure DevOps Agent) in unsupported and can lead to all kinds issues,就像您遇到的人一样。

官方建议使用第三方组件,例如Excel Package Plus (free)NPOI (free)SpreadSheetGear (Commercial)Aspose Cells.NET (Commercial)。或使用System.IO.Packagingedit the XML for the Office document directly。这些不依赖于在服务器上安装Excel的情况,实际上是受支持的,并且没有与之相关的各种许可证问题。将脚本迁移到其他软件包类型通常并不难,因为它们具有非常相似的可移植性API。

除了您遇到的技术问题外,许可甚至可能更麻烦,因为不允许Office代表其他用户自动化,并且通常也不允许在服务器上运行。 >

  

除了技术问题外,您还必须考虑许可问题。当前的许可准则禁止在服务器上使用Office应用程序来满足客户端请求,除非这些客户端本身具有Office的许可副本。最终用户许可协议(EULA)并未涵盖使用服务器端自动化向未经许可的工作站提供Office功能。

     

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

您可能能够解决某些问题,例如您现在遇到的问题,但是您可能会遇到新的问题。交互式运行Azure DevOps代理可能会有所帮助,这样,也将在交互式会话中启动Excel,而不是在没有实际桌面的受保护的隐藏用户会话中启动Excel。可能发生的情况是,通过RDP连接的第二个用户在登录时关闭了所有其他会话,或者在注销时锁定了所有会话。

  

在启用自动登录或禁用屏幕保护程序时,存在安全风险,因为您使其他用户可以走到计算机上并使用自动登录的帐户。如果将代理配置为以这种方式运行,则必须确保计算机受到了物理保护。例如,位于安全设施中。如果您使用远程桌面访问正在通过自动登录运行代理的计算机,则仅关闭远程桌面会导致计算机被锁定,并且在该代理上运行的任何UI测试都可能失败。为避免这种情况,请使用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以与执行自动化过程不同的凭据运行。


要以交互方式运行代理,请将服务配置为auto-logonthis utility encrypts the credentials used)和add run.cmd in the agent folder to the start-up executable list (either in the registry or a shortcut in the start menu)。 You can also make the agent executable (c:\windows\system32\cmd.exe /c path\to\agent\run.cmd) the default shellThere are quite a few docs on setting a custom shell

您还需要为此会话禁用屏幕保护程序和锁屏功能,这非常需要您对服务器进行物理保护,否则任何有权访问服务器控制台的人都将能够访问正在运行的交互式会话。

并且您必须不确定始终锁定远程桌面会话而不锁定它(如上)。

答案 1 :(得分:0)

我们最终确定只有在使用带触摸屏的笔记本电脑上使用RDP时,问题才发生。

然后使用此文档禁用触摸屏:

  
      
  1. 在任务栏上的搜索框中,键入“设备管理器”,然后选择   装置经理。
  2.   
  3. 选择人机界面设备旁边的箭头,然后   然后选择符合HID的触摸屏。 (可能不止一个   列出。)
  4.   
  5. 选择窗口顶部的“操作”选项卡。
  6.   
  7. 选择“禁用设备”或“启用设备”,然后确认。如果还有更多   多于列出的一台符合HID的触摸屏设备,请执行步骤2–3   也是那个。
  8.   

https://support.microsoft.com/en-us/help/4028019/windows-enable-and-disable-your-touchscreen-in-windows-10

脚本停止崩溃。

如果有人想发布答案来解决此问题而无需通过调整RDP或我们RDP所使用的服务器中的参数来禁用触摸屏,我会接受他的答案,因为一次更改参数要比要求人们更容易rdp进入我们的计算机时,请禁用其触摸屏。