Vista的 UAC真的很烦很烦!我要做的是在Vista下建立一个service然后用这个service建立一个新的进程并要求这个进程必须有管理员权限,当然前提是我知道用户名和密码。我的实现方法是 // execute install file
HANDLE hToken;
LPVOID lpvEnv;
PROCESS_INFORMATION pi = {0};
STARTUPINFO si = {0}; si.cb = sizeof(STARTUPINFO); //
// TO DO: change NULL to '.' to use local account database
//
if (!LogonUser(L"administrator@domain", NULL, L"psw",LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT, &hToken))
{
DWORD dwErrCode = GetLastError();
WCHAR wstrErrCode[16];
memset(wstrErrCode,0,sizeof(wstrErrCode));
wsprintf(wstrErrCode,L"%d",dwErrCode);
MessageBox(NULL,wstrErrCode,L"Logon User Failed!",MB_OK|MB_ICONINFORMATION);
}
if (!CreateEnvironmentBlock(&lpvEnv, hToken, TRUE))
{
DWORD dwErrCode = GetLastError();
WCHAR wstrErrCode[16];
memset(wstrErrCode,0,sizeof(wstrErrCode));
wsprintf(wstrErrCode,L"%d",dwErrCode);
MessageBox(NULL,wstrErrCode,L"Create Environment Block Failed!",MB_OK|MB_ICONINFORMATION);
}
//
// TO DO: change NULL to '.' to use local account database
//
if (!CreateProcessWithLogonW(
L"administrator@domain",
NULL,
L"psw",
LOGON_WITH_PROFILE,
NULL,
L"all command-line",
CREATE_UNICODE_ENVIRONMENT,
lpvEnv,
NULL,
&si,
&pi))
{
DWORD dwErrCode = GetLastError();
WCHAR wstrErrCode[16];
memset(wstrErrCode,0,sizeof(wstrErrCode));
wsprintf(wstrErrCode,L"%d",dwErrCode);
MessageBox(NULL,wstrErrCode,L"Create Process Failed!",MB_OK|MB_ICONINFORMATION);
} if (!DestroyEnvironmentBlock(lpvEnv))
{
DWORD dwErrCode = GetLastError();
WCHAR wstrErrCode[16];
memset(wstrErrCode,0,sizeof(wstrErrCode));
wsprintf(wstrErrCode,L"%d",dwErrCode);
MessageBox(NULL,wstrErrCode,L"Destroy Environment Block Failed!",MB_OK|MB_ICONINFORMATION);
} CloseHandle(hToken);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);这段code单独放在一个问win32的console里,工作的很好,但是把它加到service的执行部分时,CreateProcessWithLogonW()总是得到“Access is denied”的error code。 那位高人知道是怎么回事,怎么解决呢?谢谢!
HANDLE hToken;
LPVOID lpvEnv;
PROCESS_INFORMATION pi = {0};
STARTUPINFO si = {0}; si.cb = sizeof(STARTUPINFO); //
// TO DO: change NULL to '.' to use local account database
//
if (!LogonUser(L"administrator@domain", NULL, L"psw",LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT, &hToken))
{
DWORD dwErrCode = GetLastError();
WCHAR wstrErrCode[16];
memset(wstrErrCode,0,sizeof(wstrErrCode));
wsprintf(wstrErrCode,L"%d",dwErrCode);
MessageBox(NULL,wstrErrCode,L"Logon User Failed!",MB_OK|MB_ICONINFORMATION);
}
if (!CreateEnvironmentBlock(&lpvEnv, hToken, TRUE))
{
DWORD dwErrCode = GetLastError();
WCHAR wstrErrCode[16];
memset(wstrErrCode,0,sizeof(wstrErrCode));
wsprintf(wstrErrCode,L"%d",dwErrCode);
MessageBox(NULL,wstrErrCode,L"Create Environment Block Failed!",MB_OK|MB_ICONINFORMATION);
}
//
// TO DO: change NULL to '.' to use local account database
//
if (!CreateProcessWithLogonW(
L"administrator@domain",
NULL,
L"psw",
LOGON_WITH_PROFILE,
NULL,
L"all command-line",
CREATE_UNICODE_ENVIRONMENT,
lpvEnv,
NULL,
&si,
&pi))
{
DWORD dwErrCode = GetLastError();
WCHAR wstrErrCode[16];
memset(wstrErrCode,0,sizeof(wstrErrCode));
wsprintf(wstrErrCode,L"%d",dwErrCode);
MessageBox(NULL,wstrErrCode,L"Create Process Failed!",MB_OK|MB_ICONINFORMATION);
} if (!DestroyEnvironmentBlock(lpvEnv))
{
DWORD dwErrCode = GetLastError();
WCHAR wstrErrCode[16];
memset(wstrErrCode,0,sizeof(wstrErrCode));
wsprintf(wstrErrCode,L"%d",dwErrCode);
MessageBox(NULL,wstrErrCode,L"Destroy Environment Block Failed!",MB_OK|MB_ICONINFORMATION);
} CloseHandle(hToken);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);这段code单独放在一个问win32的console里,工作的很好,但是把它加到service的执行部分时,CreateProcessWithLogonW()总是得到“Access is denied”的error code。 那位高人知道是怎么回事,怎么解决呢?谢谢!
解决方案 »
- 想用c++做多媒体效果,求推荐书目
- 定义好一个类,在用它的成员函数时提示:error C2228: left of '.WriteErrLog' must have class/struct/un
- 求VC入门书
- vc 多文档的问题 急!
- 请问comer教授所著网际互连三卷本的第二卷源代码用什么工具打开?
- 如何编码使控件可以在容器中被拖动--急
- 请问:QQ里的按Ctrl+Enter发送是怎么实现的?
- DAO如何连接到Access2000?
- ---一点成绩---我写了一个关于IE的URI译码程序,想要的来信告知?
- 这样的目的怎样实现。谁能给个思路or提示
- 读取大文本文件的速度问题
- SPY++ 讀不到 MSN 的窗體裡的控件,用什麼東東來讀?
这个帖子里面有代码供你参考