Autor
Nachricht
SeekingForTheAnswer
Unregistrierter
SeekingForTheAnswer Unregistrierter
17:07:07 23.01.2012 Titel:
DACL für Datei setzen funktioniert nicht
Zitieren
Hallo,
es gibt mal wieder ein Problem. Mein Ziel ist es die DACL einer Datei so umzuändern, dass alle Benutzer (und Benutzergruppen) die Datei nur noch Löschen, Ausführen und Besitz ergreifen können. Diese Berechtigungen ändern soll keiner können. Hier mein Code:
C/C++ Code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
BOOL SetDACLForObject(const char * Object, SE_OBJECT_TYPE ObjectType, int AccessPerms, ACCESS_MODE AccessMode)
{
char StrTrustee[4][100] = {"Administrators ", "System ", "Users ", ""};
char UserName[100];
DWORD SizeUserName = sizeof (UserName);
GetUserName(UserName, &SizeUserName);
strcpy(StrTrustee[3], UserName);
DWORD Res = 0;
PACL NewDACL = NULL;
PSID SidAdmin = NULL;
PSECURITY_DESCRIPTOR SD = NULL;
SID_IDENTIFIER_AUTHORITY SIDAuthNT = SECURITY_NT_AUTHORITY;
EXPLICIT_ACCESS ea[4];
if (!AllocateAndInitializeSid(&SIDAuthNT, 2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0,
0, 0, &SidAdmin))
{
cout <<"AllocateAndInitializeSid() failed: " <<GetLastError() <<endl;
return FALSE;
}
ZeroMemory(&ea, 4 * sizeof (EXPLICIT_ACCESS));
ea[0].grfAccessPermissions = AccessPerms;
ea[0].grfAccessMode = AccessMode;
ea[0].grfInheritance = NO_PROPAGATE_INHERIT_ACE; //NO_INHERITANCE;
ea[0].Trustee.TrusteeForm = TRUSTEE_IS_NAME;
ea[0].Trustee.TrusteeType = TRUSTEE_IS_GROUP;
ea[0].Trustee.ptstrName = (LPTSTR) (StrTrustee[0]);
ea[1].grfAccessPermissions = AccessPerms;
ea[1].grfAccessMode = AccessMode;
ea[1].grfInheritance = NO_PROPAGATE_INHERIT_ACE;
ea[1].Trustee.TrusteeForm = TRUSTEE_IS_NAME;
ea[1].Trustee.ptstrName = (LPTSTR) (StrTrustee[1]);
ea[2].grfAccessPermissions = AccessPerms;
ea[2].grfAccessMode = AccessMode;
ea[2].grfInheritance = NO_PROPAGATE_INHERIT_ACE;
ea[2].Trustee.TrusteeForm = TRUSTEE_IS_NAME;
ea[2].Trustee.TrusteeType = TRUSTEE_IS_COMPUTER;
ea[2].Trustee.ptstrName = (LPTSTR) (StrTrustee[2]);
ea[3].grfAccessPermissions = AccessPerms;
ea[3].grfAccessMode = AccessMode;
ea[3].grfInheritance = NO_PROPAGATE_INHERIT_ACE;
ea[3].Trustee.TrusteeForm = TRUSTEE_IS_NAME;
ea[3].Trustee.TrusteeType = TRUSTEE_IS_USER;
ea[3].Trustee.ptstrName = (LPTSTR) (StrTrustee[3]);
Res = SetEntriesInAcl(4, ea, NULL, &NewDACL);
if (Res != ERROR_SUCCESS)
{
cout <<"SetEntriesInAcl() failed: " <<GetLastError() <<endl;
return FALSE;
}
Res = SetNamedSecurityInfo((LPTSTR) Object, ObjectType, DACL_SECURITY_INFORMATION, SidAdmin, NULL, NewDACL, NULL);
if (Res != ERROR_SUCCESS)
{
cout <<"SetNamedSecurityInfo() failed: " <<GetLastError() <<endl;
return FALSE;
}
LocalFree(SD);
LocalFree(NewDACL);
return TRUE;
}
C/C++ Code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
BOOL SetDACLForObject(const char * Object, SE_OBJECT_TYPE ObjectType, int AccessPerms, ACCESS_MODE AccessMode)
{
char StrTrustee[4][100] = {"Administrators ", "System ", "Users ", ""};
char UserName[100];
DWORD SizeUserName = sizeof (UserName);
GetUserName(UserName, &SizeUserName);
strcpy(StrTrustee[3], UserName);
DWORD Res = 0;
PACL NewDACL = NULL;
PSID SidAdmin = NULL;
PSECURITY_DESCRIPTOR SD = NULL;
SID_IDENTIFIER_AUTHORITY SIDAuthNT = SECURITY_NT_AUTHORITY;
EXPLICIT_ACCESS ea[4];
if (!AllocateAndInitializeSid(&SIDAuthNT, 2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0,
0, 0, &SidAdmin))
{
cout <<"AllocateAndInitializeSid() failed: " <<GetLastError() <<endl;
return FALSE;
}
ZeroMemory(&ea, 4 * sizeof (EXPLICIT_ACCESS));
ea[0].grfAccessPermissions = AccessPerms;
ea[0].grfAccessMode = AccessMode;
ea[0].grfInheritance = NO_PROPAGATE_INHERIT_ACE; //NO_INHERITANCE;
ea[0].Trustee.TrusteeForm = TRUSTEE_IS_NAME;
ea[0].Trustee.TrusteeType = TRUSTEE_IS_GROUP;
ea[0].Trustee.ptstrName = (LPTSTR) (StrTrustee[0]);
ea[1].grfAccessPermissions = AccessPerms;
ea[1].grfAccessMode = AccessMode;
ea[1].grfInheritance = NO_PROPAGATE_INHERIT_ACE;
ea[1].Trustee.TrusteeForm = TRUSTEE_IS_NAME;
ea[1].Trustee.ptstrName = (LPTSTR) (StrTrustee[1]);
ea[2].grfAccessPermissions = AccessPerms;
ea[2].grfAccessMode = AccessMode;
ea[2].grfInheritance = NO_PROPAGATE_INHERIT_ACE;
ea[2].Trustee.TrusteeForm = TRUSTEE_IS_NAME;
ea[2].Trustee.TrusteeType = TRUSTEE_IS_COMPUTER;
ea[2].Trustee.ptstrName = (LPTSTR) (StrTrustee[2]);
ea[3].grfAccessPermissions = AccessPerms;
ea[3].grfAccessMode = AccessMode;
ea[3].grfInheritance = NO_PROPAGATE_INHERIT_ACE;
ea[3].Trustee.TrusteeForm = TRUSTEE_IS_NAME;
ea[3].Trustee.TrusteeType = TRUSTEE_IS_USER;
ea[3].Trustee.ptstrName = (LPTSTR) (StrTrustee[3]);
Res = SetEntriesInAcl(4, ea, NULL, &NewDACL);
if (Res != ERROR_SUCCESS)
{
cout <<"SetEntriesInAcl() failed: " <<GetLastError() <<endl;
return FALSE;
}
Res = SetNamedSecurityInfo((LPTSTR) Object, ObjectType, DACL_SECURITY_INFORMATION, SidAdmin, NULL, NewDACL, NULL);
if (Res != ERROR_SUCCESS)
{
cout <<"SetNamedSecurityInfo() failed: " <<GetLastError() <<endl;
return FALSE;
}
LocalFree(SD);
LocalFree(NewDACL);
return TRUE;
}
C/C++ Code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
BOOL SetDACLForObject(const char * Object, SE_OBJECT_TYPE ObjectType, int AccessPerms, ACCESS_MODE AccessMode)
{
char StrTrustee[4][100] = {"Administrators ", "System ", "Users ", ""};
char UserName[100];
DWORD SizeUserName = sizeof (UserName);
GetUserName(UserName, &SizeUserName);
strcpy(StrTrustee[3], UserName);
DWORD Res = 0;
PACL NewDACL = NULL;
PSID SidAdmin = NULL;
PSECURITY_DESCRIPTOR SD = NULL;
SID_IDENTIFIER_AUTHORITY SIDAuthNT = SECURITY_NT_AUTHORITY;
EXPLICIT_ACCESS ea[4];
if (!AllocateAndInitializeSid(&SIDAuthNT, 2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0,
0, 0, &SidAdmin))
{
cout <<"AllocateAndInitializeSid() failed: " <<GetLastError() <<endl;
return FALSE;
}
ZeroMemory(&ea, 4 * sizeof (EXPLICIT_ACCESS));
ea[0].grfAccessPermissions = AccessPerms;
ea[0].grfAccessMode = AccessMode;
ea[0].grfInheritance = NO_PROPAGATE_INHERIT_ACE; //NO_INHERITANCE;
ea[0].Trustee.TrusteeForm = TRUSTEE_IS_NAME;
ea[0].Trustee.TrusteeType = TRUSTEE_IS_GROUP;
ea[0].Trustee.ptstrName = (LPTSTR) (StrTrustee[0]);
ea[1].grfAccessPermissions = AccessPerms;
ea[1].grfAccessMode = AccessMode;
ea[1].grfInheritance = NO_PROPAGATE_INHERIT_ACE;
ea[1].Trustee.TrusteeForm = TRUSTEE_IS_NAME;
ea[1].Trustee.ptstrName = (LPTSTR) (StrTrustee[1]);
ea[2].grfAccessPermissions = AccessPerms;
ea[2].grfAccessMode = AccessMode;
ea[2].grfInheritance = NO_PROPAGATE_INHERIT_ACE;
ea[2].Trustee.TrusteeForm = TRUSTEE_IS_NAME;
ea[2].Trustee.TrusteeType = TRUSTEE_IS_COMPUTER;
ea[2].Trustee.ptstrName = (LPTSTR) (StrTrustee[2]);
ea[3].grfAccessPermissions = AccessPerms;
ea[3].grfAccessMode = AccessMode;
ea[3].grfInheritance = NO_PROPAGATE_INHERIT_ACE;
ea[3].Trustee.TrusteeForm = TRUSTEE_IS_NAME;
ea[3].Trustee.TrusteeType = TRUSTEE_IS_USER;
ea[3].Trustee.ptstrName = (LPTSTR) (StrTrustee[3]);
Res = SetEntriesInAcl(4, ea, NULL, &NewDACL);
if (Res != ERROR_SUCCESS)
{
cout <<"SetEntriesInAcl() failed: " <<GetLastError() <<endl;
return FALSE;
}
Res = SetNamedSecurityInfo((LPTSTR) Object, ObjectType, DACL_SECURITY_INFORMATION, SidAdmin, NULL, NewDACL, NULL);
if (Res != ERROR_SUCCESS)
{
cout <<"SetNamedSecurityInfo() failed: " <<GetLastError() <<endl;
return FALSE;
}
LocalFree(SD);
LocalFree(NewDACL);
return TRUE;
}
Ich rufe die Funktion zweimal auf:
C/C++ Code: SetDACLForObject("C:\\Test.txt ", SE_FILE_OBJECT, CUSTOM_ALLOW, SET_ACCESS);
SetDACLForObject("C:\\Test.txt ", SE_FILE_OBJECT, CUSTOM_DENY, DENY_ACCESS);
C/C++ Code: SetDACLForObject("C:\\Test.txt ", SE_FILE_OBJECT, CUSTOM_ALLOW, SET_ACCESS);
SetDACLForObject("C:\\Test.txt ", SE_FILE_OBJECT, CUSTOM_DENY, DENY_ACCESS);
C/C++ Code: SetDACLForObject("C:\\Test.txt ", SE_FILE_OBJECT, CUSTOM_ALLOW, SET_ACCESS);
SetDACLForObject("C:\\Test.txt ", SE_FILE_OBJECT, CUSTOM_DENY, DENY_ACCESS);
mit
C/C++ Code: #define CUSTOM_ALLOW (READ_CONTROL |\
WRITE_OWNER |\
DELETE)
#define CUSTOM_DENY (WRITE_DAC)
C/C++ Code: #define CUSTOM_ALLOW (READ_CONTROL |\
WRITE_OWNER |\
DELETE)
#define CUSTOM_DENY (WRITE_DAC)
C/C++ Code: #define CUSTOM_ALLOW (READ_CONTROL |\
WRITE_OWNER |\
DELETE)
#define CUSTOM_DENY (WRITE_DAC)
Das Ergebnis ist enttäuschend. Alle Benutzer und Benutzergruppen haben Vollzugriff auf die Datei und nur die Verweigern-Spalte ist noch editierbar, nicht die Zulassen. Was mache ich falsch?
Vielen Dank schonmal für jede gute Antwort!
der besitzer
Unregistrierter
der besitzer Unregistrierter
17:35:45 23.01.2012 Titel:
Zitieren
Der Besitzer kann immer die Berechtigung ändern!
SeekingForTheAnswer
Unregistrierter
SeekingForTheAnswer Unregistrierter
18:51:46 23.01.2012 Titel:
Zitieren
Danke erstmal für die Antwort. Das könnte natürlich ein Widerspruch sein, aber wenn ich CUSTOM_ALLOW und CUSTOM_DENY umdefiniere:
C/C++ Code: #define CUSTOM_ALLOW (READ_CONTROL |\
DELETE)
#define CUSTOM_DENY (WRITE_DAC |\
WRITE_OWNER)
C/C++ Code: #define CUSTOM_ALLOW (READ_CONTROL |\
DELETE)
#define CUSTOM_DENY (WRITE_DAC |\
WRITE_OWNER)
C/C++ Code: #define CUSTOM_ALLOW (READ_CONTROL |\
DELETE)
#define CUSTOM_DENY (WRITE_DAC |\
WRITE_OWNER)
...besteht das Problem weiterhin.
der besitzer
Unregistrierter
der besitzer Unregistrierter
20:12:02 23.01.2012 Titel:
Zitieren
Die übergeordneten Objecte sind das Problem!
SeekingForTheAnswer
Unregistrierter
SeekingForTheAnswer Unregistrierter
07:59:03 24.01.2012 Titel:
Zitieren
Entschuldigung, aber kannst du das genauer erklären?
der besitzer
Unregistrierter
der besitzer Unregistrierter
16:23:02 24.01.2012 Titel:
Zitieren
Die übergeordneten Objekte dürfen nicht vererbt werden.
SeekingForTheAnswer
Unregistrierter
SeekingForTheAnswer Unregistrierter
19:50:32 24.01.2012 Titel:
Zitieren
Okay, habe mal auf NO_INHERITANCE gestellt. Das Problem ist aber ein anderes, SetEntriesInAcl gibt den Errorcode 1332 zurück, deshalb wird die Funktion garnicht komplett durchgeführt.
hustbaer
Mitglied
Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 12957
hustbaer Mitglied
22:12:25 24.01.2012 Titel:
Zitieren
1332 No mapping between account names and security IDs was done.
Er mag also einen deiner Strings nicht.
Probier sie einzeln durch, dann weisst du welchen.
Offensichtliche Probleme: "Users" ist wohl kein Computername. "" wird kein gültiger Username sein. Beim 2. Eintrag setzt du "TrusteeType" nicht (k.A. ob die Null die du von ZeroMemory dort stehen hast der passende TrusteeType ist, ich würd's aber auf jeden Fall trotzdem hinschreiben, auch wenn 0 das ist was du brauchst).
Alles Schlampigkeitsfehler.
_________________ "Let there be Licht..." http://lichttools.sourceforge.net/
Sehr cooles ASCII Spiel (leider nicht von mir): ASCII-Scramble - http://www.roskakori.at/ascii/
Martin Richter
Moderator
Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 13187
Martin Richter Moderator
08:18:12 25.01.2012 Titel:
Zitieren
Ich tippe mal eher auf ein Unicode/MBCS Konflikt, der cast auf LPTSTR gehört da garantiert nicht hin und das Projekt ist vermutlich Unicode und die Strings sind als char angelegt...
Wie immer...
_________________Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
SeekingForTheAnswer
Unregistrierter
SeekingForTheAnswer Unregistrierter
18:32:49 26.01.2012 Titel:
Zitieren
@hustbaer:
Hab mal meinen Code ein wenig geändert:
C/C++ Code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
BOOL SetDACLForObject(const char * Object, SE_OBJECT_TYPE ObjectType, int AccessPerms, ACCESS_MODE AccessMode)
{
char StrTrustee[2][100] = {"Administrators ", "System "};
char UserName[100];
DWORD SizeUserName = sizeof (UserName);
GetUserName(UserName, &SizeUserName);
DWORD Res = 0;
PACL NewDACL = NULL;
PSID SidAdmin = NULL;
PSECURITY_DESCRIPTOR SD = NULL;
SID_IDENTIFIER_AUTHORITY SIDAuthNT = SECURITY_NT_AUTHORITY;
EXPLICIT_ACCESS ea[3];
if (!AllocateAndInitializeSid(&SIDAuthNT, 2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0,
0, 0, &SidAdmin))
{
cout <<"AllocateAndInitializeSid() failed: " <<GetLastError() <<endl;
return FALSE;
}
ZeroMemory(ea, 3 * sizeof (EXPLICIT_ACCESS));
ea[0].grfAccessPermissions = AccessPerms;
ea[0].grfAccessMode = AccessMode;
ea[0].grfInheritance = NO_INHERITANCE; //NO_INHERITANCE;
ea[0].Trustee.TrusteeForm = TRUSTEE_IS_NAME;
ea[0].Trustee.TrusteeType = TRUSTEE_IS_GROUP;
ea[0].Trustee.ptstrName = (LPTSTR) (StrTrustee[0]);
/*ea[1].grfAccessPermissions = AccessPerms;
ea[1].grfAccessMode = AccessMode;
ea[1].grfInheritance = NO_INHERITANCE;
ea[1].Trustee.TrusteeForm = TRUSTEE_IS_NAME;
ea[1].Trustee.ptstrName = (LPTSTR) (CURRENT_USER);*/
ea[1].grfAccessPermissions = AccessPerms;
ea[1].grfAccessMode = AccessMode;
ea[1].grfInheritance = NO_INHERITANCE;
ea[1].Trustee.TrusteeForm = TRUSTEE_IS_NAME;
ea[1].Trustee.TrusteeType = TRUSTEE_IS_COMPUTER;
ea[1].Trustee.ptstrName = (LPTSTR) (StrTrustee[1]);
ea[2].grfAccessPermissions = AccessPerms;
ea[2].grfAccessMode = AccessMode;
ea[2].grfInheritance = NO_INHERITANCE;
ea[2].Trustee.TrusteeForm = TRUSTEE_IS_NAME;
ea[2].Trustee.TrusteeType = TRUSTEE_IS_USER;
ea[2].Trustee.ptstrName = (LPTSTR) (UserName);
Res = SetEntriesInAcl(3, ea, NULL, &NewDACL);
if (Res != ERROR_SUCCESS)
{
Res = GetLastError();
cout <<"SetEntriesInAcl() failed: " <<GetLastError() <<endl;
return FALSE;
}
Res = SetNamedSecurityInfo((LPTSTR) Object, ObjectType, DACL_SECURITY_INFORMATION, SidAdmin, NULL, NewDACL, NULL);
if (Res != ERROR_SUCCESS)
{
cout <<"SetNamedSecurityInfo() failed: " <<GetLastError() <<endl;
return FALSE;
}
LocalFree(SD);
LocalFree(NewDACL);
return TRUE;
}
C/C++ Code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
BOOL SetDACLForObject(const char * Object, SE_OBJECT_TYPE ObjectType, int AccessPerms, ACCESS_MODE AccessMode)
{
char StrTrustee[2][100] = {"Administrators ", "System "};
char UserName[100];
DWORD SizeUserName = sizeof (UserName);
GetUserName(UserName, &SizeUserName);
DWORD Res = 0;
PACL NewDACL = NULL;
PSID SidAdmin = NULL;
PSECURITY_DESCRIPTOR SD = NULL;
SID_IDENTIFIER_AUTHORITY SIDAuthNT = SECURITY_NT_AUTHORITY;
EXPLICIT_ACCESS ea[3];
if (!AllocateAndInitializeSid(&SIDAuthNT, 2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0,
0, 0, &SidAdmin))
{
cout <<"AllocateAndInitializeSid() failed: " <<GetLastError() <<endl;
return FALSE;
}
ZeroMemory(ea, 3 * sizeof (EXPLICIT_ACCESS));
ea[0].grfAccessPermissions = AccessPerms;
ea[0].grfAccessMode = AccessMode;
ea[0].grfInheritance = NO_INHERITANCE; //NO_INHERITANCE;
ea[0].Trustee.TrusteeForm = TRUSTEE_IS_NAME;
ea[0].Trustee.TrusteeType = TRUSTEE_IS_GROUP;
ea[0].Trustee.ptstrName = (LPTSTR) (StrTrustee[0]);
/*ea[1].grfAccessPermissions = AccessPerms;
ea[1].grfAccessMode = AccessMode;
ea[1].grfInheritance = NO_INHERITANCE;
ea[1].Trustee.TrusteeForm = TRUSTEE_IS_NAME;
ea[1].Trustee.ptstrName = (LPTSTR) (CURRENT_USER);*/
ea[1].grfAccessPermissions = AccessPerms;
ea[1].grfAccessMode = AccessMode;
ea[1].grfInheritance = NO_INHERITANCE;
ea[1].Trustee.TrusteeForm = TRUSTEE_IS_NAME;
ea[1].Trustee.TrusteeType = TRUSTEE_IS_COMPUTER;
ea[1].Trustee.ptstrName = (LPTSTR) (StrTrustee[1]);
ea[2].grfAccessPermissions = AccessPerms;
ea[2].grfAccessMode = AccessMode;
ea[2].grfInheritance = NO_INHERITANCE;
ea[2].Trustee.TrusteeForm = TRUSTEE_IS_NAME;
ea[2].Trustee.TrusteeType = TRUSTEE_IS_USER;
ea[2].Trustee.ptstrName = (LPTSTR) (UserName);
Res = SetEntriesInAcl(3, ea, NULL, &NewDACL);
if (Res != ERROR_SUCCESS)
{
Res = GetLastError();
cout <<"SetEntriesInAcl() failed: " <<GetLastError() <<endl;
return FALSE;
}
Res = SetNamedSecurityInfo((LPTSTR) Object, ObjectType, DACL_SECURITY_INFORMATION, SidAdmin, NULL, NewDACL, NULL);
if (Res != ERROR_SUCCESS)
{
cout <<"SetNamedSecurityInfo() failed: " <<GetLastError() <<endl;
return FALSE;
}
LocalFree(SD);
LocalFree(NewDACL);
return TRUE;
}
C/C++ Code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
BOOL SetDACLForObject(const char * Object, SE_OBJECT_TYPE ObjectType, int AccessPerms, ACCESS_MODE AccessMode)
{
char StrTrustee[2][100] = {"Administrators ", "System "};
char UserName[100];
DWORD SizeUserName = sizeof (UserName);
GetUserName(UserName, &SizeUserName);
DWORD Res = 0;
PACL NewDACL = NULL;
PSID SidAdmin = NULL;
PSECURITY_DESCRIPTOR SD = NULL;
SID_IDENTIFIER_AUTHORITY SIDAuthNT = SECURITY_NT_AUTHORITY;
EXPLICIT_ACCESS ea[3];
if (!AllocateAndInitializeSid(&SIDAuthNT, 2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0,
0, 0, &SidAdmin))
{
cout <<"AllocateAndInitializeSid() failed: " <<GetLastError() <<endl;
return FALSE;
}
ZeroMemory(ea, 3 * sizeof (EXPLICIT_ACCESS));
ea[0].grfAccessPermissions = AccessPerms;
ea[0].grfAccessMode = AccessMode;
ea[0].grfInheritance = NO_INHERITANCE; //NO_INHERITANCE;
ea[0].Trustee.TrusteeForm = TRUSTEE_IS_NAME;
ea[0].Trustee.TrusteeType = TRUSTEE_IS_GROUP;
ea[0].Trustee.ptstrName = (LPTSTR) (StrTrustee[0]);
/*ea[1].grfAccessPermissions = AccessPerms;
ea[1].grfAccessMode = AccessMode;
ea[1].grfInheritance = NO_INHERITANCE;
ea[1].Trustee.TrusteeForm = TRUSTEE_IS_NAME;
ea[1].Trustee.ptstrName = (LPTSTR) (CURRENT_USER);*/
ea[1].grfAccessPermissions = AccessPerms;
ea[1].grfAccessMode = AccessMode;
ea[1].grfInheritance = NO_INHERITANCE;
ea[1].Trustee.TrusteeForm = TRUSTEE_IS_NAME;
ea[1].Trustee.TrusteeType = TRUSTEE_IS_COMPUTER;
ea[1].Trustee.ptstrName = (LPTSTR) (StrTrustee[1]);
ea[2].grfAccessPermissions = AccessPerms;
ea[2].grfAccessMode = AccessMode;
ea[2].grfInheritance = NO_INHERITANCE;
ea[2].Trustee.TrusteeForm = TRUSTEE_IS_NAME;
ea[2].Trustee.TrusteeType = TRUSTEE_IS_USER;
ea[2].Trustee.ptstrName = (LPTSTR) (UserName);
Res = SetEntriesInAcl(3, ea, NULL, &NewDACL);
if (Res != ERROR_SUCCESS)
{
Res = GetLastError();
cout <<"SetEntriesInAcl() failed: " <<GetLastError() <<endl;
return FALSE;
}
Res = SetNamedSecurityInfo((LPTSTR) Object, ObjectType, DACL_SECURITY_INFORMATION, SidAdmin, NULL, NewDACL, NULL);
if (Res != ERROR_SUCCESS)
{
cout <<"SetNamedSecurityInfo() failed: " <<GetLastError() <<endl;
return FALSE;
}
LocalFree(SD);
LocalFree(NewDACL);
return TRUE;
}
@Martin Richter:
Mein Projekt ist auf Multibyte gestellt.
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.