windows服务如何访问映射驱动器中的文件?

来源:互联网 发布:怎么推广淘宝客 编辑:程序博客网 时间:2024/06/10 09:55

最近遇到一个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个函数来源于网上,特此感谢....