最近遇到一个customer issue,跟踪分析后,发现错误原因是通过windows服务启动的进程无法访问映射驱动器中的文件,根本就找不到这个文件,
HANDLE hFF = FindFirstFile(L"z:\\a\\a.txt",&fd);
if (hFF == INVALID_HANDLE_VALUE)
{
error("cannot find the file");
}
错误码是3.
尝试了各种办法,最后找到了一种方法:
1.服务用localsystem身份运行
2.用如下方式启动进程
BOOL GetTokenByName(HANDLE &hToken,LPWSTR lpName)
{
if(!lpName)
{
return FALSE;
}
HANDLE hProcessSnap = NULL;
BOOL bRet = FALSE;
PROCESSENTRY32 pe32 = {0};
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
return (FALSE);
pe32.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(hProcessSnap, &pe32))
{
do
{
if(!lstrcmp(_wcsupr(pe32.szExeFile),_wcsupr(lpName)))
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,
FALSE,pe32.th32ProcessID);
bRet = OpenProcessToken(hProcess,TOKEN_ALL_ACCESS,&hToken);
CloseHandle (hProcessSnap);
return (bRet);
}
}
while (Process32Next(hProcessSnap, &pe32));
bRet = TRUE;
OutputDebugString(L"GetToken success!");
}
else
bRet = FALSE;
OutputDebugString(L"GetToken fail!");
CloseHandle (hProcessSnap);
return (bRet);
}
BOOL RunProcess(LPCTSTR lpImage)
{
if(!lpImage)
{
return FALSE;
}
HANDLE hToken;
if(!GetTokenByName(hToken,L"EXPLORER.EXE"))
{
return FALSE;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb= sizeof(STARTUPINFO);
//si.lpDesktop = TEXT("winsta0//default");
BOOL bResult = CreateProcessAsUser(hToken,lpImage,NULL,NULL,NULL,
FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi);
CloseHandle(hToken);
if(bResult)
{
getchar();
}
else
{
OutputDebugString(L"CreateProcessAsUser false!/r/n");
}
return bResult;
}
主要原理是获取explorer进程的token,然后启动进程.以上2个函数来源于网上,特此感谢....