2017-08-30 5 views
0

Ich habe ein C++ - Programm, das als Systemdienst unter "NT Authority \ System" ausgeführt wird.GetNamedSecurityInfo Intermittierender Fehler mit Fehler = 2

Das Programm hat mehrere Threads, und jeder Thread wird gelegentlich aufwachen und versuchen, die ACL für einen angegebenen Pfad zu laden. Das Problem, zu dem ich renne, ist, dass ich sporadisch sehe, dass der GetNamedSecurityInfo() -Aufruf mit Error = 2, File Not Found fehlschlägt. Das Seltsame ist, dass dieser Anruf für eine Weile mit demselben Pfad erfolgreich ist, dann passiert etwas und der Anruf wird dann fehlschlagen.

Mein Code sieht wie folgt aus:

 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); 
     } 

Ich habe tagelang auf diesen einen meinen Kopf gegen eine Wand zu schlagen und wurde jede Hilfe sehr geschätzt würde.

Danke!

+0

Oh, und ich habe überprüft, dass der Dienst Zugriff auf die \\ Server \ Freigabe \ und auch auf den Ordner hat. Und der Ordner existiert. Der Anruf funktioniert die meiste Zeit sehr gut und wird dann einfach fehlschlagen, bis ich den Dienst neu starte. – WebDrive

+0

der '\\ server \ share \ zugeordnet mit welcher Anmeldesitzung luid? und welche Luid haben Sie in Token beim Aufruf * GetNamedSecurityInfo *? – RbMm

+0

Der Dienst ist unter "NT Authority \ System" angemeldet. Die NTFS-ACL auf der Freigabe hat Jeder mit vollen Rechten. und das zugrunde liegende Verzeichnis auf dem C: \, auf das von der Freigabe verwiesen wird, hat eine NTFS-ACL mit allen/vollständigen Rechten auch. – WebDrive

Antwort

0

So stellte sich heraus, dass einige wie das Identitätswechsel-Token wurde beschädigt oder wurde versehentlich geschlossen. RevertToSelf wird zurück zum lokalen System geleitet, das nichts über die UNC-Freigabe weiß, so dass es genau zurückgegeben wurde. 2. Danke für die Hilfe, ich schließe das aus.

Verwandte Themen