DACL - Was bedeutet der Fehler? (997)
-
Ich wollte die ACCESS_MASK für die Rechte des aktuellen Benutzers auf eine Datei erhalten und habe folgenden Code erstellt. Der Aufruf der GetEffectiveRightsFromAcl schlug jedoch fehl mit dem Fehlercode 997 - Überlappender E/A-Vorgang wird verarbeitet. Woher stammt dieser Fehler? Arbeitet eine der aufgerufenen Funktionen asynchron und hat ihre Arbeit noch nicht beendet oder habe ich einfach etwas falsch gemacht?
#include <iostream> #include <windows.h> #include <conio.h> #include <Accctrl.h> #include <Aclapi.h> int main() { DWORD dwRet = 0; DWORD dwbufsize = 0; PCHAR secdesc = NULL; TRUSTEE tr; BOOL bRet = FALSE; ACCESS_MASK mask; PACL acl = NULL; HANDLE hAccessToken; BOOL isdefaultedacl = FALSE; BOOL isdaclpresent = FALSE; PTOKEN_USER pTu = NULL; ZeroMemory(&tr,sizeof(TRUSTEE)); ZeroMemory(&mask,sizeof(ACCESS_MASK)); dwRet = GetLastError(); //Security Descriptor abfragen if (!GetFileSecurity("c:\\1.txt",DACL_SECURITY_INFORMATION,secdesc,0,&dwbufsize)) { if (GetLastError()!=ERROR_INSUFFICIENT_BUFFER) { return -1; } secdesc = new CHAR[dwbufsize]; if (!GetFileSecurity("c:\\1.txt",DACL_SECURITY_INFORMATION,secdesc,dwbufsize,&dwbufsize)) { return -1; } } else { return -1; } //DACL aus dem Security Descriptor erhalten if (!GetSecurityDescriptorDacl(secdesc,&isdaclpresent,&acl,&isdefaultedacl)) { return -1; } if (!isdaclpresent) { //Wo ist sie hin? :-) return -1; } //Prozesstoken öffnen if(!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY,&hAccessToken)) { return -1; } //TokenUser abfragen if (!GetTokenInformation(hAccessToken, TokenUser, pTu, 0, &dwbufsize)) { if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { return -1; } pTu = (PTOKEN_USER) new CHAR[dwbufsize]; if (!GetTokenInformation(hAccessToken, TokenUser, pTu,dwbufsize, &dwbufsize)) { return -1; } } //Trustee initialisieren tr.TrusteeForm = TRUSTEE_IS_SID; tr.TrusteeType = TRUSTEE_IS_USER; tr.MultipleTrusteeOperation = NO_MULTIPLE_TRUSTEE; tr.pMultipleTrustee = NULL; tr.ptstrName = (LPWSTR)(pTu->User.Sid); //Effektive Rechte des Trustees gemäß ACL erhalten if (!GetEffectiveRightsFromAcl(acl ,&tr, &mask)) { std::cout << GetLastError(); //997 ERROR_IO_PENDING - Überlappender E/A-Vorgang wird verarbeitet. return -1; } getch(); return 0; }
-
Ich fürchte, das ist zu speziell
MfG RoaN;
-
roan312 schrieb:
Ich fürchte, das ist zu speziell
MfG RoaN;
Fürchte ich auch, wo geht man denn hin für solche speziellen WinAPI-Sachen?
-
frag doch mal in einer newsgroup z.B.
microsoft.public.platformsdk.security
oder
comp.os.ms-windows.programmer.win32Mit Visual C++ 7.1 lässt sich das übrigens nicht kompilieren.
Der Compiler meckert in Zeile 75: error C2440: '=': 'LPWSTR' kann nicht in 'LPSTR' konvertiert werden
-
Ändere mal die Abfrage auf:
if (GetEffectiveRightsFromAcl(acl ,&tr, &mask) != ERROR_SUCCESS)
Dann merkst du das die Funktion gar nicht fehl schlägt.
-
Grober schrieb:
Dann merkst du das die Funktion gar nicht fehl schlägt.
Hoppla, hab den Rückgabewert gar nicht beachtet
Naja, dankeschön, jetzt funktioniert es wie gewünscht.In meinem aktuellen Quelltext steht (LPSTR). Ich war mir zuerst unsicher, ob die entsprechende Struktur auch für ANSI implementiert wurde, denn das ist ja vor allem bei der NTSECAPI an vielen Stellen nicht der Fall.