AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Daten aus der Registry lesen mit TService
Thema durchsuchen
Ansicht
Themen-Optionen

Daten aus der Registry lesen mit TService

Ein Thema von fips0705 · begonnen am 28. Mär 2007 · letzter Beitrag vom 13. Apr 2007
Antwort Antwort
Seite 2 von 3     12 3      
Olli
(Gast)

n/a Beiträge
 
#11

Re: Daten aus der Registry lesen mit TService

  Alt 9. Apr 2007, 15:07
Zitat von Schwedenbitter:
Würde ich gern! Ich habe nur nicht die geringste Ahnung, wie ich das machen soll. Ich weiß noch nicht einmal, wo in der Hilfe ich nachschauen bzw. nach welchen Stichworten ich suchen sollt.
???

Zitat von Schwedenbitter:
Ich verstehe auch nicht ganz, warum ich das mit meiner Anwendung prima auslesen kann. Sofern das SYSTEM quasi als User benutzt wird, wäre doch davon auszugehen, dass dieses ziemlich viel Rechte hat und die Werte deshalb lesen kann ...
Hat ja niemand gesagt, daß du nicht die Rechte hast wenn du im SYSTEM-Kontext unterwegs bist, nur hast du definitiv ein anderes Mapping der Win32-Rootschlüssel. Aber ich wiederhole mich bereits.
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#12

Re: Daten aus der Registry lesen mit TService

  Alt 9. Apr 2007, 17:39
Zitat von Olli:
HKEY_USERS\S-1-5-21-??????????-??????????-??????????-500
Wie bekomme ich diesen Nummern-Schlüssel raus? Dass dieser unterschiedlich ist/sein kann, entnehme ich jedenfalls den Fragezeichen. Und ich wollte mein Programm so schreiben, dass es auf verschiedenen Rechnern mit verschiedenen Windows-Installationen laufen kann.
Alex Winzer
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#13

Re: Daten aus der Registry lesen mit TService

  Alt 9. Apr 2007, 20:32
Ich zitiere mich mal selber:

Zitat von Olli:
In diesem Fall hole man sich die SID des Benutzers (notfalls auch den vollen Namen) und lese den entsprechenden Wert unter HKEY_USERS aus.
Das letzte Element (die 500) ist der Standardwert für das eingebaute Adminkonto. Dieser Wert ist also auch variabel, je nachdem für welchen Benutzer du die SID ermittelst.
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#14

Re: Daten aus der Registry lesen mit TService

  Alt 10. Apr 2007, 07:37
So, ich habe mir im Netz jetzt folgenden Quellcode zusammengesucht bzw. gebastelt:

Delphi-Quellcode:
Function GetSID:String;
   Function TokenToUserSidString(Token:THandle):String;
   Const
      SECURITY_NT_AUTHORITY = 5;
   Type
      PSID = ^TSID;
      TSID = Packed Record
                     Revision : Byte;
                     SubAuthorityCount : Byte;
                     IdentifierAuthority : TSIDIdentifierAuthority;
                     // [0..SubAuthorityCount - 1]
                     SubAuthority : Array [Byte] Of DWORD;
                   End;
      PTokenUser = ^TTokenUser;
      TTokenUser = Record
                      User : TSIDAndAttributes;
                     End;
   Var
      User : PTokenUser;
      Size : DWORD;
      Loop : Byte;
   Begin
      Result:='';
      Size:=4096;
      GetMem(User,Size);
      Try
         FillChar(User^,Size,0);
         If GetTokenInformation(Token,TokenUser,User,Size,Size) Then
            With PSID(User^.User.Sid)^ Do
            Begin
               Result:='S-'+IntToStr(Revision)+'-'+
                        IntToStr(IdentifierAuthority.Value[SECURITY_NT_AUTHORITY]);
               For Loop:=0 To SubAuthorityCount-1 Do
                  Result:=Result+'-'+IntToStr(SubAuthority[Loop]);
            End;
      Finally
         FreeMem(User);
      End;
   End;
Var
   Token : THandle;
Begin
   If OpenProcessToken(GetCurrentProcess,TOKEN_QUERY,Token) Then
   Begin
      Try
         Result:=TokenToUserSidString(Token);
      Finally
         CloseHandle(Token);
      End;
   End      
   Else
      Result:='Error';
End;
In meiner Anwendung funktioniert das und ich bekomme die lange Nummer. Wenn ich das in meinen Dienst einbaue, erhalte ich als Ergebnis immer S-1-5-18. Liegt vermutlich daran, dass der Dients als Benutzer System hat.

Wie kann ich das ändern?
Alex Winzer
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#15

Re: Daten aus der Registry lesen mit TService

  Alt 10. Apr 2007, 09:02
Bequemer geht's mit MSDN-Library durchsuchenConvertSidToStringSid (ab Windows 2000).

Zitat von Schwedenbitter:
In meiner Anwendung funktioniert das und ich bekomme die lange Nummer. Wenn ich das in meinen Dienst einbaue, erhalte ich als Ergebnis immer S-1-5-18. Liegt vermutlich daran, dass der Dients als Benutzer System hat.

Wie kann ich das ändern?
Ganz einfach, du benutzt MSDN-Library durchsuchenLookupAccountName um die SID eines beliebigen Benutzers zu ermitteln - welcher Benutzer das ist, dafür wirst du ja wohl ein Kriterium haben.
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#16

Re: Daten aus der Registry lesen mit TService

  Alt 10. Apr 2007, 11:07
Danke!

Jetzt habe ich nur noch ein Problem: Welche der vielen Units, die sich in Remkos Beispiel finden, muss ich benutzen, damit die Variable vom Typ TSidNameUse definiert ist? Diese brauche ich für LookupAccountName.
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Daten aus der Registry lesen mit TService

  Alt 10. Apr 2007, 12:10
Guck doch einfach nach.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#18

Re: Daten aus der Registry lesen mit TService

  Alt 10. Apr 2007, 12:15
Schonmal was von GREP gehoert? Ich persoenlich kann PowerGREP3 empfehlen - benutze es fast jeden Tag. Die perfekte Loesung fuer grosse Quelltextverzeichnisse usw.

Vermutlich ist es JwaNtSecApi - aber wie gesagt, am einfachsten ist wenn du dich auf unsere Projektseite begibst und dort mal eben das ganze Paket runterlaedst und dort nach der Unit suchst in welcher die Funktion deklariert ist. Verdammt, das erinnert mich, dass ich mal wieder ein neues aktualisiertes Paket releasen muss
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#19

Re: Daten aus der Registry lesen mit TService

  Alt 10. Apr 2007, 21:57
@Olli: Danke für die Hilfe.

Ich habe die Pakete jetzt geladen und das Verzeichnis meines Projektes kopiert. Außerdem habe ich den Teil des Quellcodes von Remko unter meinem o.g. Link kopiert, der die Uses-Anweisungen enthält.
Während des Kompilierens bekomme ich die Fehlermeldung, dass JwaWinSta.dcu nicht gefunden wurde. Eine entsprechende Datei (JwaWinSta.pas) habe ich in den Paketen auch nicht finden können. Scheinbar kommt es aber genau auf diese an. Denn wenn ich JwaWinSta aus den zu verwendenden Units entferne, bekomme ich die Fehlermeldung Undefinierter Bezeichner 'SidToStr'.

Ich habe auch Remkos Beispielprogramm runtergeladen und getestet. Abgesehen davon, dass bei mir die letzte Zahl nicht stimmt, statt der angezeigten 500 steht wie im Registrierungseditor 1003, lässt sich das Programm auch wegen der fehlenden JwaWinSta nicht kompilieren.

Jetzt bin ich völlig verwirrt.
Alex Winzer
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#20

Re: Daten aus der Registry lesen mit TService

  Alt 12. Apr 2007, 14:00
Ich habe mir jetzt die Function SidToStr selbst zusammengebastelt, nachdem ich sie nirgends finden so oder in einer Unit konnte. Für den Fall, dass jemand Interesse hat:
Delphi-Quellcode:
Function SIDToStr(SID:Windows.PSID):WideString;
Var
   SIA : PSIDIdentifierAuthority;
   dwCount : Cardinal;
   I : Integer;
Begin
   If Not isValidSID(SID) Then
      Result:='Error'
   Else
   Begin
      Result:='S-'+IntToStr(Byte(SID^))+'-';
      SIA:=GetSIDIdentifierAuthority(SID);
      Result:=Result+IntToStr(SIA.Value[5]);
      dwCount:=GetSIDSubAuthorityCount(SID)^;
      For I:=0 To (dwCount-1) Do
         Result:=Result+'-'+IntToStr(GetSIDSubAuthority(SID,I)^);
   End;
End;
Allerdings stehe ich vor demselben Problem wie das Programm LSALogon von Remko. Die letzten drei bzw. vier Ziffern des SID stimmen nicht. Damit komme ich nicht in diesen Unterschlüssel rein.
Ich habe jetzt auf mehreren Rechnern festgestellt, dass es neben der 1003 auch noch mehrere Möglichkeiten gibt. Meine Idee, die 500 einfach durch eine 1003 zu ersetzen, geht damit leider auch nicht mehr. Schade eigentlich.
Alex Winzer
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 04:48 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