Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [C] dumpACL (https://www.delphipraxis.net/72193-%5Bc%5D-dumpacl.html)

Luckie 26. Jun 2006 21:48


[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:
#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;
}
Und die Meldungen:
Zitat:

E:\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 Funktionsformat
Fehler beim Ausführen von cl.exe.
Die Libs:
Code:
kernel32.lib Advapi32.lib /nologo /subsystem:console /incremental:yes /pdb:"Debug/GetACL.pdb" /debug /machine:I386 /out:"Debug/GetACL.exe" /pdbtype:sept
Verwenden tue ich das VC6

Christian Seehase 26. Jun 2006 22:12

Re: [C] dumpACL
 
Moin Michael,

beim ersten Fehler:
Es fehlt wohl ein

Code:
#define _WIN32_WINNT 0x0500
Die Funktion steht nur zur Verfügung, wenn _WIN32_WINNT >= 0x0500

Luckie 26. Jun 2006 22:16

Re: [C] dumpACL
 
Auch wenn ich
Code:
#define _WIN32_WINNT 0x0500
schreibe geht es nicht. Gleiche Fehlermeldungen.

Doch geht, muss nur ganz oben in vor die includes noch. Bleibt der Fehler beim Aufruf von _dumpDacl.

So kompiliert es jetzt:
Code:
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;
}
Aber beim Aufruf von GetNamedSecurityInfo bekomme ich eine "Unbehandelte Ausnahme".

Christian Seehase 26. Jun 2006 23:21

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]

Luckie 26. Jun 2006 23:33

Re: [C] dumpACL
 
Das ist kein Typecast, sondern eine Variablen Deklaration.

Was hast du denn wie umgestellt? Poste doch mal deine Version.

Christian Seehase 26. Jun 2006 23:44

Re: [C] dumpACL
 
Moin Michael,

so sieht's bei mir aus:

Code:
#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;
}
Das mit der Variablendeklaration: Siehe meinen Kommentar (EDIT) im vorigen Beitrag ;-)

Luckie 26. Jun 2006 23:59

Re: [C] dumpACL
 
Nehme ich deine Version bekomme ich:
Zitat:

E:\C\Programme\GetACL\dumpacl.cpp(55) : error C2664: 'GetNamedSecurityInfoW' : Konvertierung des Parameters 1 von 'char *' in 'unsigned short *' nicht moeglich
Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
E:\C\Programme\GetACL\dumpacl.cpp(56) : 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 Funktionsformat

Christian Seehase 27. Jun 2006 02:44

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 ;-)

Basilikum 27. Jun 2006 07:14

Re: [C] dumpACL
 
Code:
#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;
}
ich würde auf diese Variante tippen:
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;
}

Luckie 27. Jun 2006 08:24

Re: [C] dumpACL
 
Zitat:

Zitat von Christian Seehase
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 ;-)

Willst du mich jetzt ärgern? :mrgreen: Hier habe ich verzweifelt nach einer Lösung gefragt: http://www.delphipraxis.net/internal...=568554#568554

Noch eins. Ich habe diese Funktion:
Delphi-Quellcode:

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;
um die SID in den zugehörigen Namen umzuwandeln. Aber pace.SidStart ist ein Cardinal, wie komme ich denn jetzt an den Namen dran?

NicoDE 27. Jun 2006 09:18

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:

Zitat von Luckie
Aber pace.SidStart ist ein Cardinal, wie komme ich denn jetzt an den Namen dran?

SidStart ist das erste DWORD der SID. Demzufolge: (PSID)&pace->SidStart

Luckie 27. Jun 2006 09:44

Re: [C] dumpACL
 
Dank dir auch noch mal für deine Mühe.

Zitat:

SidStart ist das erste DWORD der SID. Demzufolge: (PSID)&pace->SidStart
Und wie sähe das in Delphi aus? In C sieht mir das ja schon äußerst suspekt aus.

NicoDE 27. Jun 2006 09:46

Re: [C] dumpACL
 
Delphi-Quellcode:
PSID(Addr(Ace.SidStart))

Luckie 27. Jun 2006 09:57

Re: [C] dumpACL
 
Perfekt. :thumb:

Christian Seehase 27. Jun 2006 13:22

Re: [C] dumpACL
 
Moin Michael,

da hättest Du Dir ja mal meinen Quelltext ansehen können... ;-)

Zitat:

Zitat von Luckie
Willst du mich jetzt ärgern? :mrgreen:

JA JA JA :twisted:

:mrgreen:

Aber im Ernst: Irgendwie war das da bei mir noch nicht so durchgedrungen

Luckie 27. Jun 2006 14:08

Re: [C] dumpACL
 
Hach, ich bin immer wieder begeistert von diesem Forum mit seiner Community. :P

Luckie 27. Jun 2006 15:04

Re: [C] dumpACL
 
@Nico: Welche zwei Parameter erwartet deine C Version?

NicoDE 27. Jun 2006 15:20

Re: [C] dumpACL
 
Zitat:

Zitat von Luckie
@Nico: Welche zwei Parameter erwartet deine C Version?

Ist einfach ein 'Bug' :)
(ich hatte ursprünglich den Dateinamen als Parameter übergeben - argv[1])

Luckie 27. Jun 2006 15:30

Re: [C] dumpACL
 
Und jetzt? Einfach das if löschen?

NicoDE 27. Jun 2006 17:07

Re: [C] dumpACL
 
Zitat:

Zitat von Luckie
Und jetzt? Einfach das if löschen?

Genau.

Luckie 27. Jun 2006 17:36

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