Ошибка CreateProcessAsUser , используйте GetLastError (), чтобы получить код ошибки 1314

Я использую Win7 OS и среда разработки vs2005.

Ситуация заключается в том, что я хочу создать процесс в качестве привилегии текущей учетной записи (например, в обычной учетной записи щелкните правой кнопкой мыши на выборе программы «Запуск от имени администратора»).

Я имею в виду путь других людей:
1. получить токен процесса explorer.exe;
2. улучшить привилегию;
3. Используйте CreateProcessAsUser для создания процесса.

Но CreateProcessAsUser не удалось, и используйте GetLastError (), чтобы получить код ошибки 1314.

Из-за этого я думаю, что сейчас я сумасшедший.
Можете ли вы сказать мне, что не так в моей программе. Спасибо!!!

    #include <iostream>
using namespace std;

#include "windows.h"#include "tlhelp32.h"

BOOL GetProcessTokenByName(HANDLE &hToken, LPTSTR szProcessName)
{
// var init
STARTUPINFO st;
PROCESS_INFORMATION pi;
PROCESSENTRY32 ps;
HANDLE hSnapshot;
ZeroMemory(&st, sizeof(STARTUPINFO));
ZeroMemory(&pi, sizeof(PROCESS_INFORMATIO

N));
st.cb = sizeof(STARTUPINFO);
ZeroMemory(&ps,sizeof(PROCESSENTRY32));
ps.dwSize = sizeof(PROCESSENTRY32);
// find the explorer.exe
hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0);
if(hSnapshot == INVALID_HANDLE_VALUE)
{
return FALSE;
}
if(!Process32First(hSnapshot,&ps))
{
return FALSE;
}
do
{
wprintf(_T("%s , %u\n"), ps.szExeFile, ps.th32ProcessID);
// compare the process name
if(lstrcmpi(ps.szExeFile,szProcessName)==0)
{            // find
//*lpPID = ps.th32ProcessID;
//CloseHandle(hSnapshot);
//return TRUE;

HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, ps.th32ProcessID);
BOOL bRet = FALSE;
HANDLE tmpToken;
if( OpenProcessToken(hProcess, /*TOKEN_QUERY*/TOKEN_ALL_ACCESS, &tmpToken) )
{
bRet = DuplicateTokenEx(
tmpToken,                        //_In_      HANDLE hExistingToken,
MAXIMUM_ALLOWED,                //_In_      DWORD dwDesiredAccess,
NULL,                            //_In_opt_  LPSECURITY_ATTRIBUTES lpTokenAttributes,
SecurityIdentification,            //_In_      SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
TokenPrimary,                    //_In_      TOKEN_TYPE TokenType,
&hToken                            //_Out_     PHANDLE phNewToken
);

//DWORD dwSessionId = WTSGetActiveConsoleSessionId();
//SetTokenInformation(hToken,TokenSessionId,(void*)dwSessionId,sizeof(DWORD));

//SetPrivilege(hToken, SE_ASSIGNPRIMARYTOKEN_NAME, TRUE);}
else
{
printf("OpenProcessToken error: %u\n", GetLastError());
}
CloseHandle (hSnapshot);
return (bRet);
}
}while(Process32Next(hSnapshot,&ps));
// didn't find
CloseHandle(hSnapshot);
return FALSE;
}

BOOL RunasUser( )
{
HANDLE    hToken;
if( GetProcessTokenByName( hToken, _T("explorer.exe") ) )
{
if( hToken != INVALID_HANDLE_VALUE )
{
STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb= sizeof(STARTUPINFO);
si.lpDesktop = TEXT("winsta0\\default");

{
TOKEN_PRIVILEGES    tp;
tp.PrivilegeCount    =1;
if(!LookupPrivilegeValue(NULL,SE_ASSIGNPRIMARYTOKEN_NAME/*SE_DEBUG_NAME*/,&tp.Privileges[0].Luid))
{
printf("LookupPrivilegeValue value Error: %u\n",GetLastError());
}

tp.Privileges[0].Attributes    = SE_PRIVILEGE_ENABLED;
if(!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, NULL) )
{
printf("Adjust Privilege value Error: %u\n",GetLastError());
}
}
printf("Adjust Privilege\n");
{
TOKEN_PRIVILEGES    tp;
tp.PrivilegeCount    =1;
if(!LookupPrivilegeValue(NULL,SE_INCREASE_QUOTA_NAME/*SE_DEBUG_NAME*/,&tp.Privileges[0].Luid))
{
printf("LookupPrivilegeValue value Error: %u\n",GetLastError());
}
tp.Privileges[0].Attributes    = SE_PRIVILEGE_ENABLED;
if(!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, NULL) )
{
printf("Adjust Privilege value Error: %u\n",GetLastError());
}
}

BOOL bResult = CreateProcessAsUser(
hToken,                            //_In_opt_     HANDLE hToken,
_T("D:\\GetMac.exe"),            //_In_opt_     LPCTSTR lpApplicationName,
NULL,                            //_Inout_opt_  LPTSTR lpCommandLine,
NULL,                            //_In_opt_     LPSECURITY_ATTRIBUTES lpProcessAttributes,
NULL,                            //_In_opt_     LPSECURITY_ATTRIBUTES lpThreadAttributes,
FALSE,                            //_In_         BOOL bInheritHandles,
NORMAL_PRIORITY_CLASS,            //_In_         DWORD dwCreationFlags,
NULL,                            //_In_opt_     LPVOID lpEnvironment,
NULL,                            //_In_opt_     LPCTSTR lpCurrentDirectory,
&si,                            //_In_         LPSTARTUPINFO lpStartupInfo,
&pi                                //_Out_        LPPROCESS_INFORMATION lpProcessInformation
);
CloseHandle(hToken);

if( bResult )
{
//succeed
return TRUE;
}
else
{   //fail
DWORD dwErr = GetLastError();
printf( "error: %u\n", dwErr );
}
}
}
else
{
printf("GetProcessTokenByName fail\n");
}

return FALSE;
}
int _tmain(int argc, _TCHAR* argv[])
{

BOOL bRet = RunasUser();

printf("result: %d\n", bRet);
system("pause");
return 0;
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …