使用Cjwdev.WindowsApi
/// <summary>
/// 执行BAT(前端)
/// 创建一个进程,并以指定的会话身份运行一个应用程序或命令。
/// 这对于需要模拟用户上下文或在特定权限下执行操作的应用程序特别有用。
/// </summary>
/// <param name="strAppPath">bat或exe文件路径</param>
/// <param name="cmdlinestr">执行cmd的命令字符串(已拼接参数)</param>
public static void StartApp(string strAppPath, string cmdlinestr)
{
    //‌IntPtr‌ 是 C# 中用于表示指针或句柄的结构体,主要用于处理非托管代码、与 Windows API 交互或管理非托管资源。‌
    IntPtr userTokenHandle = IntPtr.Zero;
    //获取当前会话的令牌句柄,以便在当前会话中启动进程。
    //这通常用于模拟用户会话,特别是在需要特定权限或会话上下文时。
    ApiDefinitions.WTSQueryUserToken(ApiDefinitions.WTSGetActiveConsoleSessionId(), ref userTokenHandle);
    //创建进程信息结构体,用于存储新启动的进程的信息。
    ApiDefinitions.PROCESS_INFORMATION procInfo = new ApiDefinitions.PROCESS_INFORMATION();
    //创建启动信息结构体,用于指定新进程的窗口外观和启动选项。
    ApiDefinitions.STARTUPINFO startInfo = new ApiDefinitions.STARTUPINFO();
    //初始化启动信息结构体的大小。这通常是通过计算结构体的内存大小来实现的,使用 Marshal.SizeOf 方法获取结构体的大小(以字节为单位),并将其赋值给 cb 成员。
    startInfo.cb = (uint)Marshal.SizeOf(startInfo);
    //设置启动信息结构体的 dwFlags 成员,以指示新进程的窗口外观。例如,如果希望隐藏窗口,可以设置为 STARTF_USESHOWWINDOW | SW_HIDE。
    ApiDefinitions.CreateProcessAsUser(
        userTokenHandle,
        strAppPath,
        cmdlinestr,
        IntPtr.Zero,
        IntPtr.Zero,
        false,
        0,
        IntPtr.Zero,
        null,
        ref startInfo,
        out procInfo);

    if (userTokenHandle != IntPtr.Zero)
        ApiDefinitions.CloseHandle(userTokenHandle);

    int _currentAquariusProcessId = (int)procInfo.dwProcessId;

}

 

posted on 2025-01-22 13:45  邢帅杰  阅读(7)  评论(0编辑  收藏  举报