Windows Via C/C++:vista下的应用程序权限控制
http://blog.csdn.net/xiewneqi/article/details/4643650
http://blog.csdn.net/kesalin/article/details/4076061
BOOL ExecutePackageWithPrivilege(LPCWSTR fileName, LPCWSTR args, LPCWSTR baseDir, BOOL bWait)
{
SHELLEXECUTEINFOW sei = { 0 };
ZeroMemory(&sei, sizeof(sei));
//sei.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
sei.hwnd = NULL;
sei.cbSize = sizeof(SHELLEXECUTEINFOW);
sei.lpVerb = _TEXT("runas");
sei.lpFile = fileName;
sei.nShow = SW_HIDE;
//sei.nShow = SW_SHOW;
sei.lpParameters = args;
sei.lpDirectory = baseDir;
wxMessageBox(wxString::Format(wxT("CMD: %s, Args: %s."), fileName, args));
//CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
if (!ShellExecuteEx(&sei))
{
DWORD dwStatus = GetLastError();
switch (dwStatus)
{
case ERROR_FILE_NOT_FOUND:
wxMessageBox(wxString::Format(wxT("ERROR_FILE_NOT_FOUND, ERROR Code: %d."), dwStatus));
break;
case ERROR_PATH_NOT_FOUND:
wxMessageBox(wxString::Format(wxT("ERROR_PATH_NOT_FOUND, ERROR Code: %d."), dwStatus));
break;
case ERROR_DDE_FAIL:
wxMessageBox(wxString::Format(wxT("ERROR_DDE_FAIL, ERROR Code: %d."), dwStatus));
break;
case ERROR_NO_ASSOCIATION:
wxMessageBox(wxString::Format(wxT("ERROR_NO_ASSOCIATION, ERROR Code: %d."), dwStatus));
break;
case ERROR_ACCESS_DENIED:
wxMessageBox(wxString::Format(wxT("ERROR_ACCESS_DENIED, ERROR Code: %d."), dwStatus));
break;
case ERROR_DLL_NOT_FOUND:
wxMessageBox(wxString::Format(wxT("ERROR_DLL_NOT_FOUND, ERROR Code: %d."), dwStatus));
break;
case ERROR_CANCELLED:
wxMessageBox(wxString::Format(wxT("ERROR_CANCELLED, ERROR Code: %d."), dwStatus));
break;
case ERROR_NOT_ENOUGH_MEMORY:
wxMessageBox(wxString::Format(wxT("ERROR_NOT_ENOUGH_MEMORY, ERROR Code: %d."), dwStatus));
break;
case ERROR_SHARING_VIOLATION:
wxMessageBox(wxString::Format(wxT("ERROR_SHARING_VIOLATION, ERROR Code: %d."), dwStatus));
break;
default:
break;
}
return FALSE;
}
//CoUninitialize();
if (bWait)
{
HANDLE hProcess = sei.hProcess;
if (hProcess != 0)
{
WaitForSingleObject(hProcess, INFINITE);
CloseHandle(hProcess);
}
else
{
wxMessageBox(wxT("sei.hProcess is NULL!"));
}
}
return TRUE;
}