![]() |
[C] dumpACL
Da es ja nun mit Delphi nicht geklappt hat, muss ich wohl oder übe auf C zurückgreifen. Der Cide aus dem Bucjh ist auch wunderbar nur bekomme ich beim Linken ein, zwei Problemchen:
Code:
Und die Meldungen:
#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; } Zitat:
Code:
Verwenden tue ich das VC6
kernel32.lib Advapi32.lib /nologo /subsystem:console /incremental:yes /pdb:"Debug/GetACL.pdb" /debug /machine:I386 /out:"Debug/GetACL.exe" /pdbtype:sept
|
Re: [C] dumpACL
Moin Michael,
beim ersten Fehler: Es fehlt wohl ein
Code:
Die Funktion steht nur zur Verfügung, wenn _WIN32_WINNT >= 0x0500
#define _WIN32_WINNT 0x0500
|
Re: [C] dumpACL
Auch wenn ich
Code:
schreibe geht es nicht. Gleiche Fehlermeldungen.
#define _WIN32_WINNT 0x0500
Doch geht, muss nur ganz oben in vor die includes noch. Bleibt der Fehler beim Aufruf von _dumpDacl. So kompiliert es jetzt:
Code:
Aber beim Aufruf von GetNamedSecurityInfo bekomme ich eine "Unbehandelte Ausnahme".
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; } |
Re: [C] dumpACL
Moin Michael,
seltsam :gruebel: Ich habe Deine Routine mal per Copy&Paste in eine Borland C++ Applikation kopiert. (Konsolenanwendung) Nach dem Umstellen von ein paar Zeilen ((wer deklariert aber auch Variablen mitten im Code ;-)), und der Deklaration von i als DWORD (der Typecast ist übrigens nicht DWORD i sondern (DWORD) i, den konnte ich dann weglassen), compiliert das Ganze. Ich bekomme nur zwei Warnings (Suspicious Pointer conversion). Wenn ich die Makrodefinition hinzufüge, kann ich auch die original MS-Header aus dem PSDK nehmen. [EDIT] Funktionieren tut es dann allerdings trotzdem nicht. :mrgreen: Ich bekomme nicht einmal args[0] ausgegeben (wird fehlerlos drüber weggeangen). Das Programm schmiert mit einem Access Denied ab [/EDIT] |
Re: [C] dumpACL
Das ist kein Typecast, sondern eine Variablen Deklaration.
Was hast du denn wie umgestellt? Poste doch mal deine Version. |
Re: [C] dumpACL
Moin Michael,
so sieht's bei mir aus:
Code:
Das mit der Variablendeklaration: Siehe meinen Kommentar (EDIT) im vorigen Beitrag ;-)
#define _WIN32_WINNT 0x0500
#define UNICODE #include "G:\Programme\Microsoft SDK\include\windows.h" #include "G:\Programme\Microsoft SDK\include\Sddl.h" #include "G:\Programme\Microsoft SDK\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; DWORD i; const wchar_t* pszGrantOrDeny; GetAclInformation(pdacl, &sizeInfo, sizeof sizeInfo, AclSizeInformation); for (i = 0; i < sizeInfo.AceCount; ++i) { ACCESS_ALLOWED_ACE* pace; GetAce(pdacl, i, (void**)&pace); 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"); } } #pragma argsused int main(int argc, char* argv[]) { PACL* dacl; PSECURITY_DESCRIPTOR* ppSecurityDescriptor; wprintf(L"%s", argv[0]); GetNamedSecurityInfo(argv[0], SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, dacl, NULL, ppSecurityDescriptor); _dumpDacl(dacl); return 0; } |
Re: [C] dumpACL
Nehme ich deine Version bekomme ich:
Zitat:
|
Re: [C] dumpACL
Liste der Anhänge anzeigen (Anzahl: 1)
Moin Michael,
da ich keine grosse Lust verspürte das Problem in C weiter anzugehen, habe ich es auf Delphi umgebaut (siehe Anhang). Das funktioniert wenigstens ;-) |
Re: [C] dumpACL
Code:
ich würde auf diese Variante tippen:
#pragma argsused
int main(int argc, char* argv[]) { PACL* dacl; PSECURITY_DESCRIPTOR* ppSecurityDescriptor; wprintf(L"%s", argv[0]); GetNamedSecurityInfo(argv[0], SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, dacl, NULL, ppSecurityDescriptor); _dumpDacl(dacl); return 0; }
Code:
#pragma argsused
int main(int argc, char* argv[]) { PACL dacl; // einmal * zuviel PSECURITY_DESCRIPTOR ppSecurityDescriptor; // dito printf(L"%s", argv[0]); // weshalb w(ide), wenn danach ein pchar folgt ? GetNamedSecurityInfoA( // das argv[0] ist pchar (LPTSTR)argv[0], // wegen der Warnung SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &dacl, NULL, // das & braucht es schon &ppSecurityDescriptor // dito ); _dumpDacl(dacl); return 0; } |
Re: [C] dumpACL
Zitat:
![]() Noch eins. Ich habe diese Funktion:
Delphi-Quellcode:
um die SID in den zugehörigen Namen umzuwandeln. Aber pace.SidStart ist ein Cardinal, wie komme ich denn jetzt an den Namen dran?function GetAccountSIDStrW(sid: PSID; var Name: WideString): DWORD; var UserSize, DomainSize: DWORD; snu : SID_NAME_USE; User : WideString; Domain : WideString; begin result := 0; UserSize := 0; DomainSize := 0; LookupAccountSidW(nil, sid, nil, UserSize, nil, DomainSize, snu); if (UserSize <> 0) and (DomainSize <> 0) then begin SetLength(User, UserSize); SetLength(Domain, DomainSize); if LookupAccountSidW(nil, sid, PWideChar(User), UserSize, PWideChar(Domain), DomainSize, snu) then begin User := PWideChar(User); Domain := PWideChar(Domain); Name := Domain + '\' + User; end else result := GetLastError; end end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz