Delphi-PRAXiS
Seite 1 von 3  1 23      

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 22: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 23: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 23: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 27. Jun 2006 00: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 27. Jun 2006 00: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 27. Jun 2006 00: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 27. Jun 2006 00: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 03: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 08: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 09: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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:04 Uhr.
Seite 1 von 3  1 23      

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