![]() |
[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; |
Re: [C] dumpACL
Code:
#define WINVER 0x0500
#define _WIN32_WINNT 0x0500 //#define NONAMELESSUNION //#define WIN32_LEAN_AND_MEAN #include <windows.h> #include <aclapi.h> #include <sddl.h> #include <stdio.h> #include <tchar.h> void PrintSid( PSID a_pSid ) { LPTSTR pszStringSid; if( ConvertSidToStringSid( a_pSid, &pszStringSid ) ) { _tprintf( TEXT("%s"), pszStringSid ); LocalFree( (HLOCAL)pszStringSid ); } } void DumpACL( PACL a_pAcl ) { ACL_SIZE_INFORMATION Info; if( GetAclInformation( a_pAcl, &Info, sizeof(ACL_SIZE_INFORMATION), AclSizeInformation ) ) { DWORD i; for( i = 0; i < Info.AceCount; i++ ) { LPVOID pAce; if( GetAce( a_pAcl, i, &pAce ) ) { LPCTSTR pszType; PACE_HEADER pHead = (PACE_HEADER)pAce; switch( pHead->AceType ) { case ACCESS_ALLOWED_ACE_TYPE: pszType = TEXT("allow"); break; case ACCESS_DENIED_ACE_TYPE: pszType = TEXT("deny"); break; case SYSTEM_AUDIT_ACE_TYPE: pszType = TEXT("audit"); break; case SYSTEM_ALARM_ACE_TYPE: pszType = TEXT("alarm"); break; default: pszType = TEXT("<unknwon>"); break; } PACCESS_ALLOWED_ACE pAccess = (PACCESS_ALLOWED_ACE)pAce; _tprintf( TEXT("%s %8.8x (flags: %2.2x) to "), pszType, pAccess->Mask, pHead->AceFlags); PrintSid( (PSID)(&pAccess->SidStart) ); _tprintf( TEXT("\n") ); } } } } int _tmain(int argc, _TCHAR* argv[]) { if( 2 == argc ) { PACL pAcl; PSECURITY_DESCRIPTOR pSecurityDescriptor; _tprintf( TEXT("%s\n"), argv[0] ); if( ERROR_SUCCESS == GetNamedSecurityInfo( argv[0], SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &pAcl, NULL, &pSecurityDescriptor ) ) { DumpACL( pAcl ); LocalFree( (HLOCAL)pSecurityDescriptor ); } } return 0; } Zitat:
|
Re: [C] dumpACL
Dank dir auch noch mal für deine Mühe.
Zitat:
|
Re: [C] dumpACL
Delphi-Quellcode:
PSID(Addr(Ace.SidStart))
|
Re: [C] dumpACL
Perfekt. :thumb:
|
Re: [C] dumpACL
Moin Michael,
da hättest Du Dir ja mal meinen Quelltext ansehen können... ;-) Zitat:
:mrgreen: Aber im Ernst: Irgendwie war das da bei mir noch nicht so durchgedrungen |
Re: [C] dumpACL
Hach, ich bin immer wieder begeistert von diesem Forum mit seiner Community. :P
|
Re: [C] dumpACL
@Nico: Welche zwei Parameter erwartet deine C Version?
|
Re: [C] dumpACL
Zitat:
(ich hatte ursprünglich den Dateinamen als Parameter übergeben - argv[1]) |
Re: [C] dumpACL
Und jetzt? Einfach das if löschen?
|
Re: [C] dumpACL
Zitat:
|
Re: [C] dumpACL
Jupp, habe es schon zum Laufen gebracht.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:47 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-2025 by Thomas Breitkreuz