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

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



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值