服务启动窗口程序,CreateProcessAsUser失败,错误码为0x00000002

xiaoyu_code 2014-03-06 11:07:09
CreateProcessAsUser(hTokenDup, NULL, "F:\VCProjects\LoginDlg\Debug\LoginDlg.exe", NULL, NULL, FALSE, dwCreationFlag, pEnv, NULL, &si, &pi);

这个错误码不知道是什么错误,卡在这里了,求帮助!!急!!
...全文
1109 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2014-03-06
  • 打赏
  • 举报
回复
BOOL WINAPI CreateProcessAsUser(
  __in_opt     HANDLE hToken,
  __in_opt     LPCTSTR lpApplicationName,
  __inout_opt  LPTSTR lpCommandLine,
  __in_opt     LPSECURITY_ATTRIBUTES lpProcessAttributes,
  __in_opt     LPSECURITY_ATTRIBUTES lpThreadAttributes,
  __in         BOOL bInheritHandles,
  __in         DWORD dwCreationFlags,
  __in_opt     LPVOID lpEnvironment,
  __in_opt     LPCTSTR lpCurrentDirectory,
  __in         LPSTARTUPINFO lpStartupInfo,
  __out        LPPROCESS_INFORMATION lpProcessInformation
);
第三个参数LPTSTR,不是LPCTSTR TCHAR szApp[MAX_PATH] = _T("F:\\VCProjects\\LoginDlg\\Debug\\LoginDlg.exe"); CreateProcessAsUser(hTokenDup, NULL, szApp, NULL, NULL, FALSE, dwCreationFlag, pEnv, NULL, &si, &pi);
oyljerry 2014-03-06
  • 打赏
  • 举报
回复
引用 4 楼 whereisrxy 的回复:
[quote=引用 2 楼 baojianhuangbo 的回复:] 系统找不到指定的文件。 \ 是转义字符吧,是不是应该有两根比较好"F:\\VCProjects\\LoginDlg\\Debug\\LoginDlg.exe". 错误码VS可以查的, 工具->查找错误码。
换了,又显示0x00000057 参数错误[/quote] 对应的exe是否可以直接启动
xiaoyu_code 2014-03-06
  • 打赏
  • 举报
回复
引用 2 楼 baojianhuangbo 的回复:
系统找不到指定的文件。 \ 是转义字符吧,是不是应该有两根比较好"F:\\VCProjects\\LoginDlg\\Debug\\LoginDlg.exe". 错误码VS可以查的, 工具->查找错误码。
换了,又显示0x00000057 参数错误
xiaoyu_code 2014-03-06
  • 打赏
  • 举报
回复
引用 1 楼 VisualEleven 的回复:
_T("F:\\VCProjects\\LoginDlg\\Debug\\LoginDlg.exe")
加了之后,显示0x00000057 参数错误
啵啵啃 2014-03-06
  • 打赏
  • 举报
回复
系统找不到指定的文件。 \ 是转义字符吧,是不是应该有两根比较好"F:\\VCProjects\\LoginDlg\\Debug\\LoginDlg.exe". 错误码VS可以查的, 工具->查找错误码。
Eleven 2014-03-06
  • 打赏
  • 举报
回复
_T("F:\\VCProjects\\LoginDlg\\Debug\\LoginDlg.exe")
啵啵啃 2014-03-06
  • 打赏
  • 举报
回复
引用 14 楼 whereisrxy 的回复:
[quote=引用 13 楼 baojianhuangbo 的回复:] 以上代码中14, 15, 22, 31, 40行就是用的win32 API了。
CREATE_UNICODE_ENVIRONMENT 真是这个问题,3Q,非常感谢。[/quote] 不客气,解决了就好!
xiaoyu_code 2014-03-06
  • 打赏
  • 举报
回复
引用 13 楼 baojianhuangbo 的回复:
以上代码中14, 15, 22, 31, 40行就是用的win32 API了。
CREATE_UNICODE_ENVIRONMENT 真是这个问题,3Q,非常感谢。
啵啵啃 2014-03-06
  • 打赏
  • 举报
回复
以上代码中14, 15, 22, 31, 40行就是用的win32 API了。
啵啵啃 2014-03-06
  • 打赏
  • 举报
回复
引用 11 楼 whereisrxy 的回复:
[quote=引用 10 楼 baojianhuangbo 的回复:]
不行哦,一直都是0x00000057, 搞不懂了[/quote] 那篇博客最下面提到两个问题,不知道你注意没,有个说少个CREATE_UNICODE_ENVIRONMENT 标志。你加上试试,如果不行你参考参考我这个,但是不是复制的system token,只是用的登录用户的token。 这个代码是我自己做的程序用的。

public static void CreateProcess(string app, string cmd)
        {
            bool result;
            IntPtr hToken = WindowsIdentity.GetCurrent().Token;
            IntPtr hDupedToken = IntPtr.Zero;

            PROCESS_INFORMATION pi = new PROCESS_INFORMATION();
            SECURITY_ATTRIBUTES sa = new SECURITY_ATTRIBUTES();
            sa.Length = Marshal.SizeOf(sa);

            STARTUPINFO si = new STARTUPINFO();
            si.cb = Marshal.SizeOf(si);

            int dwSessionID = WTSGetActiveConsoleSessionId();
            result = WTSQueryUserToken(dwSessionID, out hToken);

            if (!result)
            {
                //ShowMessageBox("WTSQueryUserToken failed", "AlertService Message");
            }

            result = DuplicateTokenEx(hToken, GENERIC_ALL_ACCESS, ref sa,
                (int)SECURITY_IMPERSONATION_LEVEL.SecurityIdentification, (int)TOKEN_TYPE.TokenPrimary, ref hDupedToken);

            if (!result)
            {
                //ShowMessageBox("DuplicateTokenEx failed", "AlertService Message");
            }

            IntPtr lpEnvironment = IntPtr.Zero;
            result = CreateEnvironmentBlock(out lpEnvironment, hDupedToken, false);

            if (!result)
            {
                //ShowMessageBox("CreateEnvironmentBlock failed", "AlertService Message");
            }

            string temppath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData);

            result = CreateProcessAsUser(hDupedToken, app, cmd, ref sa, ref sa,
                false, 0, IntPtr.Zero, null, ref si, ref pi);

            if (!result)
            {
                int error = Marshal.GetLastWin32Error();
                //string message = String.Format("CreateProcessAsUser Error: {0}", error);
                // ShowMessageBox(message, "AlertService Message");
            }

            if (pi.hProcess != IntPtr.Zero)
                CloseHandle(pi.hProcess);
            if (pi.hThread != IntPtr.Zero)
                CloseHandle(pi.hThread);
            if (hDupedToken != IntPtr.Zero)
                CloseHandle(hDupedToken);
        }
xiaoyu_code 2014-03-06
  • 打赏
  • 举报
回复
引用 10 楼 baojianhuangbo 的回复:
不行哦,一直都是0x00000057, 搞不懂了
啵啵啃 2014-03-06
  • 打赏
  • 举报
回复
引用 9 楼 whereisrxy 的回复:
[quote=引用 6 楼 VisualEleven 的回复:]
不行啊,还是显示参数错误,我把整个代码贴出来吧
HANDLE hTokenThis = NULL;
	HANDLE hTokenDup = NULL;
	HANDLE hThisProcess = GetCurrentProcess();
	BOOL bResult = FALSE;
	bResult = OpenProcessToken(hThisProcess, TOKEN_ALL_ACCESS, &hTokenThis);
	if(!bResult)
	{
		printf("OpenProcessToken Failed! Error = 0x%08lx\n", GetLastError());
		return;
	}
	
	bResult = DuplicateTokenEx(hTokenThis, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &hTokenDup);
	if(!bResult)
	{
		printf("DuplicateTokenEx Failed! Error = 0x%08lx\n", GetLastError());
		return;
	}

	DWORD dwSessionId = WTSGetActiveConsoleSessionId();
	bResult = SetTokenInformation(hTokenDup, TokenSessionId, &dwSessionId, sizeof(DWORD));
	if(!bResult)
	{
		printf("SetTokenInformation Failed! Error = 0x%08lx\n", GetLastError());
		return;
	}

	STARTUPINFO si;
	PROCESS_INFORMATION pi;
	ZeroMemory(&si, sizeof(STARTUPINFO));
	ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
	si.cb = sizeof(STARTUPINFO);
	si.lpDesktop = "WinSta0\\Default";

	LPVOID pEnv = NULL;
	DWORD dwCreationFlag = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE;

	bResult = CreateEnvironmentBlock(&pEnv, hTokenDup, FALSE);
	if(!bResult)
	{
		printf("CreateEnvironmentBlock Failed! Error = 0x%08lx\n", GetLastError());
		return;
	}
	
	TCHAR szApp[MAX_PATH] = _T("F:\\VCProjects\\LoginDlg\\Debug\\LoginDlg.exe");
	bResult = CreateProcessAsUser(hTokenDup, NULL, szApp, NULL, NULL, FALSE, dwCreationFlag, pEnv, NULL, &si, &pi);
	if(!bResult)
	{
		return;
	}
[/quote] CreateProcessAsUser(hTokenDup, szApp, NULL, NULL, NULL, FALSE, dwCreationFlag, pEnv, NULL, &si, &pi);试试这样。
xiaoyu_code 2014-03-06
  • 打赏
  • 举报
回复
引用 6 楼 VisualEleven 的回复:
不行啊,还是显示参数错误,我把整个代码贴出来吧
HANDLE hTokenThis = NULL;
	HANDLE hTokenDup = NULL;
	HANDLE hThisProcess = GetCurrentProcess();
	BOOL bResult = FALSE;
	bResult = OpenProcessToken(hThisProcess, TOKEN_ALL_ACCESS, &hTokenThis);
	if(!bResult)
	{
		printf("OpenProcessToken Failed! Error = 0x%08lx\n", GetLastError());
		return;
	}
	
	bResult = DuplicateTokenEx(hTokenThis, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &hTokenDup);
	if(!bResult)
	{
		printf("DuplicateTokenEx Failed! Error = 0x%08lx\n", GetLastError());
		return;
	}

	DWORD dwSessionId = WTSGetActiveConsoleSessionId();
	bResult = SetTokenInformation(hTokenDup, TokenSessionId, &dwSessionId, sizeof(DWORD));
	if(!bResult)
	{
		printf("SetTokenInformation Failed! Error = 0x%08lx\n", GetLastError());
		return;
	}

	STARTUPINFO si;
	PROCESS_INFORMATION pi;
	ZeroMemory(&si, sizeof(STARTUPINFO));
	ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
	si.cb = sizeof(STARTUPINFO);
	si.lpDesktop = "WinSta0\\Default";

	LPVOID pEnv = NULL;
	DWORD dwCreationFlag = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE;

	bResult = CreateEnvironmentBlock(&pEnv, hTokenDup, FALSE);
	if(!bResult)
	{
		printf("CreateEnvironmentBlock Failed! Error = 0x%08lx\n", GetLastError());
		return;
	}
	
	TCHAR szApp[MAX_PATH] = _T("F:\\VCProjects\\LoginDlg\\Debug\\LoginDlg.exe");
	bResult = CreateProcessAsUser(hTokenDup, NULL, szApp, NULL, NULL, FALSE, dwCreationFlag, pEnv, NULL, &si, &pi);
	if(!bResult)
	{
		return;
	}
啵啵啃 2014-03-06
  • 打赏
  • 举报
回复
引用 6 楼 VisualEleven 的回复:
BOOL WINAPI CreateProcessAsUser(
  __in_opt     HANDLE hToken,
  __in_opt     LPCTSTR lpApplicationName,
  __inout_opt  LPTSTR lpCommandLine,
  __in_opt     LPSECURITY_ATTRIBUTES lpProcessAttributes,
  __in_opt     LPSECURITY_ATTRIBUTES lpThreadAttributes,
  __in         BOOL bInheritHandles,
  __in         DWORD dwCreationFlags,
  __in_opt     LPVOID lpEnvironment,
  __in_opt     LPCTSTR lpCurrentDirectory,
  __in         LPSTARTUPINFO lpStartupInfo,
  __out        LPPROCESS_INFORMATION lpProcessInformation
);
第三个参数LPTSTR,不是LPCTSTR TCHAR szApp[MAX_PATH] = _T("F:\\VCProjects\\LoginDlg\\Debug\\LoginDlg.exe"); CreateProcessAsUser(hTokenDup, NULL, szApp, NULL, NULL, FALSE, dwCreationFlag, pEnv, NULL, &si, &pi);
看了这位仁兄贴出来的API我才发现CreateProcessAsUser第二个参数才是程序路径啊,第三个是启动命令。另外正如这个仁兄所说,保险起见应该使用TCHAR数组。
xiaoyu_code 2014-03-06
  • 打赏
  • 举报
回复
引用 5 楼 oyljerry 的回复:
对应的exe是否可以直接启动
可以直接启动,没问题,路径没错的话,那就是其他参数有问题了。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧