使用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; }
浙公網安備 33010602011771號