2017-08-30 165 views
0

我有一個C++程序作爲「NT Authority \ System」下的系統服務運行。GetNamedSecurityInfo間歇性故障,錯誤= 2

該程序有多個線程,每個線程偶爾會喚醒並嘗試加載指定路徑的ACL。我遇到的問題是,我零星地看到GetNamedSecurityInfo()調用失敗,錯誤= 2,文件未找到。奇怪的是,這個調用會在相同的路徑上成功一段時間,然後發生一些事情,然後調用就會失敗。

我的代碼看起來是這樣的:

 SE_OBJECT_TYPE dwObjectType = SE_FILE_OBJECT; 
     LPTSTR szFile = _T("\\\\server\\share\\folder"); 
     DWORD dwError = ::GetNamedSecurityInfo(szFile, dwObjectType, DACL_SECURITY_INFORMATION | OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION, 0, 0, &pDacl, 0, (void**)&pSD); 
     if (dwError || !pDacl) 
     { 
      TRACE(_T("Error=%d\n"),dwError); 
      // try it again, maybe I was impersonating a different AD user by mistake. 
      ::RevertToSelf(); 
      dwError = ::GetNamedSecurityInfo(szFile, dwObjectType, DACL_SECURITY_INFORMATION | OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION, 0, 0, &pDacl, 0, (void**)&pSD); 
      TRACE(_T("Error=%d\n"),dwError); 
     } 

我一直在打我的頭靠在牆上幾天就這一個和任何幫助,將不勝感激。

謝謝!

+0

哦,並且我已驗證該服務可以訪問\\ server \ share \以及該文件夾。該文件夾確實存在。通話在大多數情況下都很有效,然後直到我重新啓動服務時纔會失敗。 – WebDrive

+0

與哪個登錄會話luid關聯的'\\ server \ share'?並且當你調用GetNamedSecurityInfo *時,你有什麼令牌? – RbMm

+0

服務在「NT Authority \ System」下登錄。 「共享」上的NTFS ACL擁有擁有完整權限的所有人;並且共享引用的C:\上的基礎目錄也具有包含Everyone/Full權限的NTFS ACL。 – WebDrive

回答

0

所以事實證明,一些如何模仿令牌變得腐敗或無意中關閉。 RevertToSelf被迫回到不知道UNC共享的本地系統,因此它準確返回2.感謝您的幫助,我會將其關閉。