易语言CreateProcessAsUser源码
.版本 2
.支持库 spec
.程序集 程序入口
.子程序 _启动子程序, 整数型, , 本子程序在程序启动后最先执行
调试输出 (RunProcess (“C:\Windows\system32\calc.exe”))
返回 (0) ' 可以根据您的需要返回任意数值
.子程序 RunProcess, 逻辑型, , 运行进程
.参数 ProcessName, 文本型, , 欲运行进程路径
.局部变量 hToken, 整数型
.局部变量 si, STARTUPINFO
.局部变量 pi, PROCESS_INFORMATION
.局部变量 bResult, 逻辑型
.如果真 (ProcessName = “”)
返回 (#FALSE)
.如果真结束
' //获取进程Token
.如果真 (取反 (GetTokenByName (“EXPLORER.EXE”, hToken)))
返回 (#FALSE)
.如果真结束
' //进程信息设置
si.cb = 68
si.lpDesktop = “WinSta0\Default”
si.dwFlags = #STARTF_USESHOWWINDOW
si.wShowWindow = #SW_SHOW ' 显示窗口
' //创建新的进程,它将工作在新的session中
bResult = CreateProcessAsUser (hToken, ProcessName, #NULL, #NULL, #NULL, #NULL, 位或 (#NORMAL_PRIORITY_CLASS, #CREATE_NEW_CONSOLE), #NULL, #NULL, si, pi)
' //稍微等待处理
延时 (100)
' //创建完成关闭对象句柄
CloseHandle (hToken)
CloseHandle (pi.进程句柄)
CloseHandle (pi.线程句柄)
' //退出
返回 (bResult)
.子程序 GetTokenByName, 逻辑型
.参数 lpName, 文本型
.参数 hToken, 整数型, 参考
.局部变量 hProcessSnap, 整数型
.局部变量 bRet, 逻辑型
.局部变量 pe32, PROCESSENTRY32
.局部变量 exefile, 文本型
.局部变量 hProcess, 整数型
.如果真 (lpName = “”)
返回 (#FALSE)
.如果真结束
hProcessSnap = #NULL
bRet = #FALSE
' //获取系统中正在运行的进程信息
hProcessSnap = CreateToolhelp32Snapshot (#TH32CS_SNAPPROCESS, 0)
.如果真 (hProcessSnap = #INVALID_HANDLE_VALUE)
返回 (#FALSE)
.如果真结束
' //数据结构大小
pe32.dwSize = 296
' //遍历进程,取得lpName进程令牌
.如果 (Process32First (hProcessSnap, pe32))
.循环判断首 ()
' //取得当前进程信息
exefile = 到文本 (pe32.szExeFile)
' //判断是否为lpName进程
.如果真 (exefile = lpName)
' //取得当前进程句柄
hProcess = OpenProcess (#PROCESS_QUERY_INFORMATION, #NULL, pe32.th32ProcessID)
' //打开当前进程令牌
bRet = OpenProcessToken (hProcess, #TOKEN_ALL_ACCESS, hToken)
' //关闭对象句柄
CloseHandle (hProcessSnap)
返回 (bRet)
.如果真结束
.循环判断尾 (Process32Next (hProcessSnap, pe32))
bRet = #TRUE
.否则
bRet = #FALSE
' //关闭对象句柄
CloseHandle (hProcessSnap)
.如果结束
返回 (bRet)