_dumpDacl von Keith Brown
-
Ich versuche gerade den Beispielcode von Keith Brown zum Dumpen der ACEs umzusetzen. Leider ist C nicht meine Stärke. Bisher sieht es so aus:
#include <windows.h> #include <Sddl.h> #include <Aclapi.h> #include <stdio.h> void _printSid(void* psid) { wchar_t* psz; if (ConvertSidToStringSid(psid, &psz)) { wprintf(psz); LocalFree(psz); } } void _dumpDacl(ACL* pdacl) { ACL_SIZE_INFORMATION sizeInfo; GetAclInformation(pdacl, &sizeInfo, sizeof sizeInfo, AclSizeInformation); for (DWORD i = 0; i < sizeInfo.AceCount; ++i) { ACCESS_ALLOWED_ACE* pace; GetAce(pdacl, i, (void**)&pace); const wchar_t* pszGrantOrDeny; switch (pace->Header.AceType) { case ACCESS_ALLOWED_ACE_TYPE: pszGrantOrDeny = L"grant"; break; case ACCESS_DENIED_ACE_TYPE: pszGrantOrDeny = L"deny"; break; default: pszGrantOrDeny = L"<<unexpected ace type>>"; break; } wprintf(L"%s 0x%08 (inh: %X) to ", pszGrantOrDeny, pace->Mask, pace->Header.AceFlags); _printSid(&pace->SidStart); wprintf(L"\n"); } } int main(int argc, char **argv) { wprintf(L"%s", argv[0]); PACL* dacl; PSECURITY_DESCRIPTOR* ppSecurityDescriptor; GetNamedSecurityInfo(argv[0], SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, dacl, NULL, ppSecurityDescriptor); _dumpDacl(dacl); return 0; }
Die Fehlermeldungen lauten:
:\C\Programme\GetACL\dumpacl.cpp(8) : error C2065: 'ConvertSidToStringSid' : nichtdeklarierter Bezeichner
E:\C\Programme\GetACL\dumpacl.cpp(50) : error C2664: '_dumpDacl' : Konvertierung des Parameters 1 von 'struct _ACL ** ' in 'struct _ACL *' nicht moeglich
Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder FunktionsformatDie erste verstehe ich nicht, da ich doch extra für ConvertSidToStringSid Sddl.h inkludiert habe. Die zweite OK, da passen die Typen nicht zusammen, aber da weiß ich nicht, was ich machen muss.
Und würde das
PACL* dacl; PSECURITY_DESCRIPTOR* ppSecurityDescriptor; GetNamedSecurityInfo(argv[0], SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, dacl, NULL, ppSecurityDescriptor); _dumpDacl(dacl);
überhaupt so gehen?
Ich verwende das VC6
-
OK, den ersten Fehler hab eich gefunden, es hat ein
#define _WIN32_WINNT 0x0500 #define UNICODE
gefehlt. Bleibt noch der zweite Fehler beim Aufruf von _dumpDacl.
OK. So:
#define _WIN32_WINNT 0x0500 #define UNICODE #include <windows.h> #include <Sddl.h> #include <Aclapi.h> #include <stdio.h> void _printSid(void* psid) { wchar_t* psz; if (ConvertSidToStringSid(psid, &psz)) { wprintf(psz); LocalFree(psz); } } void _dumpDacl(ACL* pdacl) { ACL_SIZE_INFORMATION sizeInfo; GetAclInformation(pdacl, &sizeInfo, sizeof sizeInfo, AclSizeInformation); for (DWORD i = 0; i < sizeInfo.AceCount; ++i) { ACCESS_ALLOWED_ACE* pace; GetAce(pdacl, i, (void**)&pace); const wchar_t* pszGrantOrDeny; switch (pace->Header.AceType) { case ACCESS_ALLOWED_ACE_TYPE: pszGrantOrDeny = L"grant"; break; case ACCESS_DENIED_ACE_TYPE: pszGrantOrDeny = L"deny"; break; default: pszGrantOrDeny = L"<<unexpected ace type>>"; break; } wprintf(L"%s 0x%08 (inh: %X) to ", pszGrantOrDeny, pace->Mask, pace->Header.AceFlags); _printSid(&pace->SidStart); wprintf(L"\n"); } } int main(int argc, char **argv) { wprintf(L"%s", argv[0]); PACL dacl = 0; PSECURITY_DESCRIPTOR pSecurityDescriptor = 0; GetNamedSecurityInfo(L"argv[0]", SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, 0, 0, &dacl, 0, &pSecurityDescriptor); _dumpDacl(dacl); return 0; }
kompiliert es schon mal. allerdings bekomme ich beim Aufruf von GetNamedSecurityInfo eine unbehandelte Ausnahme.
-
L"argv[0]" schaut schonmal falsch aus. Da übergibst du ja einen String mit dem Inhalt "argv[0]" anstatt die Variable die du übergeben bekommst.
-
Kannst auch mal main (von jemand anders erweitertes) Beispiel anschauen:
http://blog.kalmbachnet.de/files/dumpacl.zip
-
In einem Delphi Forum wurde mir auch schon geholfen: http://www.delphipraxis.net/topic86438_c+dumpacl.html
Da ist dann sogar Delphi Cod ebei rausgekommen, an dem ich erst verzweifelt bin, weil Headerübersetzungen von Borland unvollständig und / oder fehlerhaft sind, deswegen hatte ich es in C probiert, aber C ist nicht unbedingt meine Stärke.
Aber trotzdem Danke für eure Mühe.
@Jochen: Ich werde es mir mal angucken, aber mit der Delphiversion aus dem obigen Thread bin ich voll und ganz zufrieden.