You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure发布流水线执行UI自动化测试时遇Win32Exception(5)权限拒绝问题

权限问题:Azure Release执行WinAppDriver自动化测试时出现Access Denied异常

问题描述

通过.bat文件使用Appium WinAppDriver运行UI自动化测试,在代理机器DOTNET4上手动运行该.bat一切正常,但通过Azure Release执行时,抛出System.ComponentModel.Win32Exception (5): Access is denied异常。

具体异常表现:

  • Azure Release流水线中,GetWindowThreadProcessId函数返回0,后续process.Kill()触发权限拒绝错误
  • 即使通过其他逻辑获取到有效进程ID,执行process.Kill()仍会出现相同权限拒绝错误
  • 手动运行.bat时,GetWindowThreadProcessId能返回AUT关联的有效进程ID,无权限问题

已尝试操作

  • 使用拥有管理员权限的BuildUser账户、本地账户分别运行发布流水线
  • 尝试多种方式让.bat以管理员身份运行
  • 为WinAppDriver.exe、AzureAgent.exe所在文件夹及AUT目录赋予完全控制权限
  • 将Azure Agent服务设置为以BuildUser账户运行,并配置该.exe以管理员身份启动

相关代码

.bat文件内容

@echo off
set TESTDIR=%~1
set LaunchedFromWinAppDriver=True
set ApplicationExe=C:\Git\filePathToExe\application.exe
C:\Git\filePathToExe\AppExeCommandLineRunner.exe -X "%ApplicationExe%"::"%TESTDIR%"

引发异常的代码片段

public static void KillApplication()
{
    try
    {
        string windowHandle = WindowDriver.CurrentWindowHandle;
        Log.Debug("CurrentWindowHandl:"+windowHandle);
        [DllImport("user32.dll")]
        static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint processId);
        IntPtr windowHandlePtr = new IntPtr(Convert.ToInt64(windowHandle, 16));
        Log.Debug("WindowHandlePtr:" +windowHandlePtr.ToString());
        uint processId;
        GetWindowThreadProcessId(windowHandlePtr, out processId);
        Log.Debug("Process Id for killing is: " + (int)processId);
        Process process = Process.GetProcessById((int)processId);
        process.Kill();
    }
    catch(Exception ex)
    {
        Log.Error("FailedToKill:", ex);
        throw;
    }
}

问题分析与解决方案

核心原因

Azure Agent以服务模式运行时,处于会话0隔离环境,无法直接访问用户会话中的窗口和进程资源。手动运行时是在用户会话中,能正常获取窗口句柄并操作进程;而服务模式下,即使账户拥有管理员权限,也无法跨会话访问用户进程,最终触发权限拒绝。

具体解决步骤

  1. 将Azure Agent改为交互式模式运行

    • 打开Windows服务,找到Azure Agent服务
    • 右键选择「属性」→「登录」选项卡,勾选「允许服务与桌面交互」
    • 重启服务后,确保用户会话处于登录状态(不能锁屏或注销)
  2. 调整进程杀死逻辑,规避窗口句柄依赖
    由于会话隔离导致无法通过窗口句柄获取进程ID,可直接通过进程名称或路径定位并杀死进程:

    public static void KillApplication()
    {
        try
        {
            // 替换为目标AUT的进程名称
            foreach (var process in Process.GetProcessesByName("application"))
            {
                // 可选:验证进程路径,避免误杀同名进程
                if (process.MainModule?.FileName.Equals(@"C:\Git\filePathToExe\application.exe", StringComparison.OrdinalIgnoreCase) == true)
                {
                    process.Kill();
                    process.WaitForExit();
                }
            }
        }
        catch(Exception ex)
        {
            Log.Error("FailedToKill:", ex);
            throw;
        }
    }
    
  3. 为Agent账户添加调试权限

    • 打开本地组策略编辑器(gpedit.msc)
    • 导航至「计算机配置」→「Windows设置」→「安全设置」→「本地策略」→「用户权限分配」
    • 找到「调试程序」权限,添加BuildUser账户
    • 重启代理机器使设置生效
  4. 修改.bat启动方式
    在Azure Release任务中,通过runas命令以交互式用户身份启动.bat:

    runas /user:DOTNET4\BuildUser /savecred "C:\path\to\your\test.bat"
    

    首次运行需输入密码,后续会保存凭据(注意凭据存储的安全风险)

内容的提问来源于stack exchange,提问作者Sharyar Vohra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 00:53:21