HANDLE hToken;
PROCESS_INFORMATION pi;
PSID pSid = NULL;
STARTUPINFO si;
BOOL bResult;
if (!LogonUser(
"myuser",
".",
"612349",
LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT,
&hToken)
)
{
MessageBox("no such user!",NULL,MB_OK);
exit(0);
}
memset(&si, 0, sizeof(si));
si.cb = sizeof(si); memset(&pi, 0, sizeof(pi));
bResult = CreateProcessAsUser(
hToken,
"F:\\TC\\BIN\\520.exe",
"F:\\TC\\BIN\\520.exe",
NULL,
NULL,
0,
NULL,
NULL,
NULL,
&si,
&pi
);
if(0 == bResult )
{ CHAR szBuf[80];
DWORD dw = GetLastError();
sprintf(szBuf, "failed: GetLastError returned %u\n", NULL, dw);
MessageBox(szBuf, NULL, MB_OK);
ExitProcess(dw);
} if (pi.hProcess != INVALID_HANDLE_VALUE)
{
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
}
else
{
MessageBox("error has occured",NULL,MB_OK);
}
if (pi.hThread != INVALID_HANDLE_VALUE)
CloseHandle(pi.hThread); 以上代码我是从MSDN那里copy过来的,只作了一点改动,却怎么都运行不成功,我是想用CreateProcessAsUser()函数来执行一个exe,上面的代码中LogonUser()函数没有错,我测试了;但接下来的CreateProcessAsUser()函数就总是失败,不知道为什么
PROCESS_INFORMATION pi;
PSID pSid = NULL;
STARTUPINFO si;
BOOL bResult;
if (!LogonUser(
"myuser",
".",
"612349",
LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT,
&hToken)
)
{
MessageBox("no such user!",NULL,MB_OK);
exit(0);
}
memset(&si, 0, sizeof(si));
si.cb = sizeof(si); memset(&pi, 0, sizeof(pi));
bResult = CreateProcessAsUser(
hToken,
"F:\\TC\\BIN\\520.exe",
"F:\\TC\\BIN\\520.exe",
NULL,
NULL,
0,
NULL,
NULL,
NULL,
&si,
&pi
);
if(0 == bResult )
{ CHAR szBuf[80];
DWORD dw = GetLastError();
sprintf(szBuf, "failed: GetLastError returned %u\n", NULL, dw);
MessageBox(szBuf, NULL, MB_OK);
ExitProcess(dw);
} if (pi.hProcess != INVALID_HANDLE_VALUE)
{
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
}
else
{
MessageBox("error has occured",NULL,MB_OK);
}
if (pi.hThread != INVALID_HANDLE_VALUE)
CloseHandle(pi.hThread); 以上代码我是从MSDN那里copy过来的,只作了一点改动,却怎么都运行不成功,我是想用CreateProcessAsUser()函数来执行一个exe,上面的代码中LogonUser()函数没有错,我测试了;但接下来的CreateProcessAsUser()函数就总是失败,不知道为什么
解决方案 »
- AfxBeginThread参数类型转换问题
- 关于bmp位图的保存问题
- vc6.0编译器汉化创天中文版bug?
- 无法读取两次
- 如何让运行中动态生成的控件响应WM消息
- vc里使用mschart,如何设置图表类型,以及stacking属性,3D属性,Row Series属性???
- COM编程具体需要那些方面的基础,详细点
- 类对象动态创建,为什么CRuntimeClass要有个成员函数CreateObject()?
- 有个问题一直搞不定,不弄了!! 抽支烟,听听歌,放分~~(UP=2分)
- 为什么我在VC中添加不了MSCOMM控件呢?请高手告诉我如何添加!!
- 一个RichEditCtrl控件的问题
- 格式化硬盘,问题解决马上接贴
hToken
[in] Handle to a primary token that represents a user. The handle must have TOKEN_QUERY, TOKEN_DUPLICATE, and TOKEN_ASSIGN_PRIMARY access. For more information, see Access Rights for Access-Token Objects. The user represented by the token must have read and execute access to the application specified by the lpApplicationName or the lpCommandLine parameter.
If your process has the SE_TCB_NAME privilege, it can call the LogonUser function to get a primary token that represents the specified user. Alternatively, you can call the DuplicateTokenEx function to convert an impersonation token into a primary token. This allows a server application that is impersonating a client to create a process that has the security context of the client.
sa.nLength=sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle=TRUE;
sa.lpSecurityDescriptor=NULL;
HANDLE hNewToken;
BOOL result;
result=DuplicateToke(hToken,
TOKEN_READ|TOKEN_QUERY|TOKEN_EXECUTE|TOKEN_ASSIGN_PRIMARY,
&sa,
SecurityImpersonation,
TokenPrimary,
&hNewToken) if(0==result)
MessageBox("DuplicateTokenEx errer has occured",NULL,MB_OK);
ImpersonateLoggedOnUser(hNewToken); bResult = CreateProcessAsUser(
hNewToken, .....);
但是结果还有错呀,CreateProcessAsUser函数还是不成功,各位高手留几句可以解决这个问题的代码吧,或者指出我的代码哪里不行,要改成哪句,拜托了,
sa.nLength=sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle=TRUE;
sa.lpSecurityDescriptor=NULL;
HANDLE hNewToken;
BOOL result;
result=DuplicateTokeEx(hToken,
TOKEN_READ|TOKEN_QUERY|TOKEN_EXECUTE|TOKEN_ASSIGN_PRIMARY,
&sa,
SecurityImpersonation,
TokenPrimary,
&hNewToken) if(0==result)
MessageBox("DuplicateTokenEx errer has occured",NULL,MB_OK);
ImpersonateLoggedOnUser(hNewToken); bResult = CreateProcessAsUser(
hNewToken, .....);
但是结果还有错呀,CreateProcessAsUser函数还是不成功,各位高手留几句可以解决这个问题的代码吧,或者指出我的代码哪里不行,要改成哪句,拜托了,
不好意思,DuplicateTokenEx错写成DuplicateToken了
Win32API出错都有错误代码的,可以帮助你分析错误。要学会利用这一特性。
如果拿到错误代码还不清楚的话,再发问吧。
....
但是
DWORD dw = GetLastError();
....返回的错误代码是0;