Zugriffsrechte für ein Laufwerk setzen
-
Hallo,
ich steh vor dem Problem, die Zugriffsrechte für ein Laufwerk neu zu setzen.
Mein Proggi (nur WinAPI) richtet einen Datenträger neu ein und formatiert dann die Laufwerke.
So weit, so gut. Funktioniert auch alles. Nur leider hat am Ende nur der Administrator vollen Zugriff auf die neuen Laufwerke.
Per XP Desktop/Laufwerk/Eigenschaften/Sicherheit lässt sich per Mausklick der Vollzugriff für "JEDEN" erfolgreich konfigurieren.Im Proggi hab ich jetzt versucht, das mit SetSecurityInfo() zu ändern. Bekomme aber immer einen Error 5 (=Access denied).
Hat einer eine Idee? Irgendwie hab ich da scheinbar einen Grunddenkfehler.
Das Attribut SE_PRIVILEGE_ENABLED wird vor dem Zugriff mit AdjustTokenPrivileges() erfolgreich gesetzt. Angemeldeter User ist der Administrator.Danke im Voraus
Ulli
-
Code zeigen...
-
...hab mich da jetzt selber erfolgreich durchgewühlt.
Hier mal die Funktion herausgeschnitten
DWORD adjustSecurity( char dl, HWND msgwnd ) { char target[32]; char msgBuf[MAX_LOADSTRING]; char msgout[MAX_LOADSTRING+64]; DWORD ret; PSID jederSID = NULL; PSECURITY_DESCRIPTOR pSD = NULL; PACL pOldDACL = NULL; PACL pNewDACL = NULL; EXPLICIT_ACCESS ea; LoadString(hInstance, CTRLSTR(IDS_SETDACL) , msgBuf, MAX_LOADSTRING); wsprintf( msgout, "%s %c:\r\n", msgBuf, dl); SendMessage( msgwnd, MSG_OUTPUT_BLANK, LOWORD(strlen(msgout)), (LPARAM)msgout ); wsprintf( target, "%c:\\", dl ); ret = SECURITY_MAX_SID_SIZE; jederSID = LocalAlloc(LMEM_FIXED, ret); if( ! CreateWellKnownSid(WinWorldSid, NULL, jederSID, &ret) ) ret = GetLastError(); else ret = ERROR_SUCCESS; if( ret == ERROR_SUCCESS ) ret = GetNamedSecurityInfo(target, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &pOldDACL, NULL, &pSD); if( ret == ERROR_SUCCESS ) { ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS)); ea.grfAccessPermissions = GENERIC_ALL; ea.grfAccessMode = SET_ACCESS; ea.grfInheritance= SUB_CONTAINERS_AND_OBJECTS_INHERIT; ea.Trustee.TrusteeForm = TRUSTEE_IS_SID; ea.Trustee.ptstrName = (LPSTR)jederSID; ret = SetEntriesInAcl(1, &ea, pOldDACL, &pNewDACL); } if( ret == ERROR_SUCCESS ) ret = SetNamedSecurityInfo(target, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, pNewDACL, NULL); if( jederSID ) LocalFree( jederSID ); if( pSD ) LocalFree( pSD ); if( pNewDACL ) LocalFree( pNewDACL ); if( ret != ERROR_SUCCESS ) { LoadString(hInstance, CTRLSTR(IDS_SETDACLERROR) , msgBuf, MAX_LOADSTRING); wsprintf( msgout, "!!! %s %d:\r\n", msgBuf, ret); SendMessage( msgwnd, MSG_OUTPUT_BLANK, LOWORD(strlen(msgout)), (LPARAM)msgout ); return showSysError( msgwnd, MB_OKCANCEL|MB_ICONERROR, ret, msgBuf ); } else return IDOK; }
-
Ulli schrieb:
Nur leider hat am Ende nur der Administrator vollen Zugriff auf die neuen Laufwerke.
Wo steckt der Sinn, dem Administrator die Zugriffsrechte zu entziehen? Wenn er will kann er sie sich wieder besorgen.
-
_Luckie schrieb:
Ulli schrieb:
Nur leider hat am Ende nur der Administrator vollen Zugriff auf die neuen Laufwerke.
Wo steckt der Sinn, dem Administrator die Zugriffsrechte zu entziehen? Wenn er will kann er sie sich wieder besorgen.
Ich hab das so verstanden: alle sollen Zugriff erhalten nicht nur der Admin. Vieleicht lieg ich auch falsch?
-
Oh, dann habe ich das falsch verstanden. Das würde dann er mehr Sinn ergeben.
-
IMHO müsste es so lauten:
ea.grfAccessPermissions = FILE_ALL_ACCESS; ea.grfAccessMode = GRANT_ACCESS; ea.grfInheritance = SUB_CONTAINERS_AND_OBJECTS_INHERIT; ea.Trustee.pMultipleTrustee = NULL; ea.Trustee.MultipleTrusteeOperation = NO_MULTIPLE_TRUSTEE; ea.Trustee.TrusteeForm = TRUSTEE_IS_SID; ea.Trustee.TrusteeType = TRUSTEE_IS_GROUP; ea.Trustee.ptstrName = (PTSTR)jederSid;
-
ja, da sind so merkwürdige Feinheiten, die wohl Microsoft-Historischen Hintergrund haben:
GENERIC_ALL für grfAccessPermissions ist 0x10000000L und ergibt Vollzugriff
FILE_ALL_ACCESS ist 0x001F01FFL und ergibt eine Zusammenstellung aus SpezialzugriffsrechtenGRANT_ACCESS - The trustee will have at least the requested permissions upon
successful completion of the command. (If the trustee has
additional permissions they will not be removed).
SET_ACCESS - The trustee will have exactly the requested permissions upon
successful completion of the command.PTSTR A PWSTR if UNICODE is defined, a PSTR otherwise.
PSTR Pointer to a null-terminated string of 8-bit Windows (ANSI) characters.LPSTR Pointer to a null-terminated string of 8-bit Windows (ANSI) characters.
typedef struct _TRUSTEE
{
PTRUSTEE pMultipleTrustee;
MULTIPLE_TRUSTEE_OPERATION MultipleTrusteeOperation;
TRUSTEE_FORM TrusteeForm;
TRUSTEE_TYPE TrusteeType;
LPTSTR ptstrName;
} TRUSTEE;
Ulli