AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

[C] dumpACL

Ein Thema von Luckie · begonnen am 26. Jun 2006 · letzter Beitrag vom 27. Jun 2006
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

[C] dumpACL

  Alt 26. Jun 2006, 21:48
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
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: [C] dumpACL

  Alt 26. Jun 2006, 22:12
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
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: [C] dumpACL

  Alt 26. Jun 2006, 22:16
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".
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: [C] dumpACL

  Alt 26. Jun 2006, 23:21
Moin Michael,

seltsam
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.
Ich bekomme nicht einmal args[0] ausgegeben (wird fehlerlos drüber weggeangen).
Das Programm schmiert mit einem Access Denied ab
[/EDIT]
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: [C] dumpACL

  Alt 26. Jun 2006, 23:33
Das ist kein Typecast, sondern eine Variablen Deklaration.

Was hast du denn wie umgestellt? Poste doch mal deine Version.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: [C] dumpACL

  Alt 26. Jun 2006, 23:44
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
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: [C] dumpACL

  Alt 26. Jun 2006, 23:59
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
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: [C] dumpACL

  Alt 27. Jun 2006, 02:44
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
Angehängte Dateien
Dateityp: dpr dumpacl_196.dpr (8,0 KB, 58x aufgerufen)
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Basilikum

Registriert seit: 9. Aug 2003
389 Beiträge
 
Delphi 7 Professional
 
#9

Re: [C] dumpACL

  Alt 27. Jun 2006, 07:14
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;
}
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

Re: [C] dumpACL

  Alt 27. Jun 2006, 08:24
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? 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?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz