![]() |
Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Hallo liebe Delphi-Gemeinde,
ich habe das Problem, dass ich einen SQL-Dienst stoppen und dann wieder starten möchte. Dies ist soweit kein Problem. Problematisch wird es, wenn ich ein eingeschränkter Nutzer bin, die demzufolge Software als Nutzer mit Adminrechten starten muss. Denn dann kann ich zwar auch den Dienst starten und stoppen. Wenn mein Programm aber gleichzeitig die Registry auslesen muss (HKEY_CURRENT_USER), erhält es die Werte der Admin-Registry und nicht des eingeschränkten Nutzers. Wie kann man das technisch umgehen, dass man trotz angeforderter Adminrechte auf die richtige Registry zugreift? Geht das überhaupt? amigage |
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Vermutlich über
![]() Das erstellte Key-Handle (HKEY) kann man dann notfalls ein ein TRegistry übergeben und dort weiter nutzen. |
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Zitat:
Du bist als User1 angemeldet und benutzt runas um als Admin ein weiteres Programm zu starten? Gruß K-H |
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Vielen lieben Dank Euch beiden, für die schnelle Reaktion.
Zitat:
![]()
Delphi-Quellcode:
function ReadRegistryValue(MyHKey : Byte; RegKey : String; RegValue : String) : String; overload;
var Reg : TRegistry; RegOpenCurrentUser: TRegOpenCurrentUser; hkResult: HKEY; begin Result := ''; Reg:=TRegistry.Create; try if MyHKey = 1 then begin RegOpenCurrentUser := GetProcAddress(GetModuleHandle('ADVAPI32.DLL'), 'RegOpenCurrentUser'); if Assigned(RegOpenCurrentUser) then if RegOpenCurrentUser(KEY_READ, @hkResult) <> ERROR_SUCCESS then begin showmessage('geht nicht!'); exit; end; end; Case MyHKey of 1: Reg.RootKey:= hkResult; //HKEY_CURRENT_USER; 2: Reg.RootKey:= HKEY_LOCAL_MACHINE; 3: Reg.RootKey:= HKEY_CLASSES_ROOT; end; Reg.Access := KEY_READ; if Reg.OpenKey(RegKey, False) then If Reg.ValueExists(RegValue) then begin try Result := Reg.ReadString(RegValue); except Result := ''; end; end; finally Reg.CloseKey; Reg.Free; end; end; |
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Hat sich erledigt. Es funktioniert!
Es lag daran, dass ich den Admin und den eingeschränkten Nutzer gleichzeitig offen hatte. Jetzt, nachdem ich neu gebootet habe und nur den eingeschränkten Nutzer geöffnet habe, arbeitet die Software so, wie sie soll. |
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Zitat:
|
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Mist, leider zu früh gefreut! Da mein Beispielprogramm bei meinem letzten Test nicht die Werte des Admin angezeigt hat, war ich der Meinung, jetzt greift er richtig zu.
Falsch gedacht: denn nachdem ich jetzt nach real existierenden Registryeinträgen des eingeschränkten Nutzers mit Adminrechten gesucht habe, erhalte ich nicht die Werte. Der Grund: Windows legt einen temporären Nutzer an (erkennbar an C:\Users\TEMP\) und greift damit wahrscheinlich auf eine nicht exisierende Registry zu. Verlasse ich den eingeschränkten NUtzer und starte ihn neu, ist der TEMP-User wieder weg. Bis ich wieder versuche, mit meinem Programm und Adminrechten auf die Registry zuzugreifen. Muss ich noch irgendetwas beachten? Ich bin schon fast am Verzeifeln und würde mich über jeden nützlichen Hinweis freuen. @himitsu: Zitat:
Besten Dank, amigage |
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Lade den gewünschten benutzerspezifischen Registry Hive manuell selber.
|
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Hallo Luckie,
okay, ich habe es jetzt mit Deiner Funktion ![]() Aber meine Funktion gibt mir immer nur den aktuellen Windows-Nutzernamen. In dem Fall den Admin-Nutzernamen.
Delphi-Quellcode:
Wie erhalte ich den Nutzernamen des tatsächlich geöffneten Nutzers ohne Adminrechte?
function GetCurrentUserName: string;
const cnMaxUserNameLen = 254; var sUserName: string; dwUserNameLen: DWORD; begin dwUserNameLen := cnMaxUserNameLen - 1; SetLength(sUserName, cnMaxUserNameLen); GetUserName(PChar(sUserName), dwUserNameLen); SetLength(sUserName, dwUserNameLen); Result := trim(sUserName); end; |
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Ich habe noch ein wenig im Netz recherchiert und bin auf die Mtx Unit gestoßen (MS Transaction Server Interface Unit).
Hier gibt es unter ISecurityProperty die Funktion ![]() Die Hilfe von Delphi ist nicht weiter aussagekräftig und hilft mir leider auch nicht weiter. Im Netz habe ich einen Codeschnipsel gefunden, der aber auch nicht wirklich weiterhilft, da bei
Delphi-Quellcode:
der Compiler den Fehler "Inkompatible Typen" ausgibt.
If Assigned(ObjectContext) then
![]() Kann mir vielleicht einer einen Tipp geben, wie ich diese Funktion GetDirectCallerSID() aufzurufen habe? Vielen Dank! amigage |
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
GetUserName gibt dir immer den Benutzer zurück in dessen Kontext der Prozess7Thread läuft von dem die Funktion aufgerufen wird. Und was ist für dich der "tatsächlich geöffnete Benutzer"? an einem System können mehrere Benutzer angemeldet sein. Interaktiv nur einer aber remote beliebig viele. Und tatsächlich sind sogar immer mehrere Bneutzer angemeldet. System zum Beispiel unter dem die meisten Dienste laufen.
|
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Hallo Luckie,
Zitat:
Ich habe halt versucht, mit GetUserName den Benutzernamen herauszufinden, um Deine Funktion GetAccountSid verwenden zu können und somit den entsprechenden HKEY_USERS Pfad zu ermitteln. Oder wie meintest Du die Aussage? Zitat:
|
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Und welcher Benutzer soll das sein?
Mir kommt dein Programmdesign immer verkorkster vor. Warum muss der Administrator Einstellungen vom Benutzer ändern? Und wie sieht es aus, wenn es mehrere Benutzer gibt, die das Programm benutzen? Unter HKLM kommen nur globale Einstellungen, die von den Benutzern nur gelesen werden sollen. Unter HKCU kommen dann die individuellen Einstellungen der Benutzer. |
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Vielleicht erkläre ich es ein wenig besser.
Das Programm muss einen Windows Dienst stoppen. Dies kann es nur mit Adminrechten. Dann muss die Software Daten aus der Registry des Nutzers lesen, um auf bestimmte Dateien zugreifen und austauschen zu können. Diese Information findet sich nur in der Registry des angemeldeten Nutzers, also dem, der die Software von Hand gestartet hat. Dann soll der Dienst wieder gestartet werden. Als Problem gestaltet es sich, wenn der Nutzer ein eingeschränkter Nutzer ist und die Adminrechte vom Adminkonto angefordert werden. Wie würdest Du es machen? |
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Unter wessen Account läuft der Dienst, ist es ein Dienst den Du im Source hast, bzw. den Du anpassen kannst?
|
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Und wenn du einfach den derzeitigen Benutzernamen vor dem Starten des Admin-Programms einfach irgendwo zwischenzpeicherst, wo ihn das Admin-Programm auch wieder auslesen kann? Irgendwo in einer Datei in CSIDL_COMMON_APPDATA oder Ähnlichem?
|
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Irgendwie ist es doch möglich rauszubekommen von welchem Programm ein Programm gestartet wurde.
> schauen welches programm das war und in wessen Benutzerkontext dieses läuft Vielleicht bekommt man auch einfach raus, zu welchem Benutzer der Desktop gehört, auf welchem das Programm grade sichtbar ist. Vorallem in Bezug auf Terminal-Server gibt es ja nicht den einen aktiven Benutzer und ein Service läuft standardmäßig im Service-Account und nicht im auswechselbaren Benutzeraccount usw. Alternativ gibt es noch einige Varianten - zwei Programme - nur einen Arbeitsthread mit Adminrechten impersonaten (oder irgendwie so), |
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
mal ganz abgesehen davon, wenn ich mir das mal bei uns an der Arbeit vorstelle. Ich arbeite an meinem Rechner in Kassel und jetzt öffnet sich eine Anforderung für Adminrechte, die ich natürlich nicht habe. Daraufhin rufe ich in Wiesbaden an, dass ich mal kur nebenher eine Remote-Desktop-Unterstützung benötige. (Bitte lieber Admin..äh, welcher von denen eigentlich?) tippe mal Dein PW ein, danke.
Wie oft am Tag kann das denn so vorkommen? |
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Wenn das "öfters" vorkommt, dann muß eben zusätzlich ein Service laufen, welcher (nur) diese Einstellungen vornimmt (über den System-Accoount).
|
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
ja, das könnte ich mir eher vorstellen als die Anforderung von Admin-Rechten für das eingeschränkte Konto.
|
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Zitat:
Zitat:
Zitat:
Ich dachte ja, dass man mit der von mir genannten Funktion ![]() @himitsu + MGC: Ich gehe eher von dem lokalen Einsatz auf einem Standalone-Rechner aus, bei dem der Anwender aus Gründen der Sicherheit beim Web-Surfen eher auf einen eingeschränkten Benutzer zurückgreift. |
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Hallo,
leider habe ich bisher keine Lösung für mein Problem finden können. Den Zugriff auf die Registry kann man ja wirklich noch umgehen, indem man "unprofessioneller Weise" den eingeschränkten Nutzernamen abspeichert und dann als Admin ausliest. Somit erhält man den richtigen SID für den HKEY_USERS Registryzweig. Problematischer ist es da schon, wenn man auf Standardpfade zugreifen will:
Delphi-Quellcode:
Hier erhält man wirklich nur die Pfade des Adminkontos statt des eingeschränkten Kontos! Oder kann man dies irgendwie korrigieren?
try
SetLength(lPath, MAX_PATH); if SHGetSpecialFolderPath(0, @lPath[1], CSIDL_APPDATA, False) then begin SetLength(lPath, pos(#0, lPath) - 1); Result := lpath; end; except // ... end; |
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Erstmal noch frohes neues Jahr!
Wenn ich diesen Thread noch richtig im Kopf habe, startest Du Dein Programm von einem eingeschränkten Nutzerkonto aus und startest dann für bestimmte Vorgänge das Admin-Konto. Wie wäre es demnach, wenn Du die Pfade ausliest bevor Du in den Adminmodus wechselst? |
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Hallo,
Dir auch ein frohes neues Jahr. Zitat:
Ich habe zwar für mein Problem eine andere Lösung gefunden, so dass ich nicht mehr in den Admin-Modus muss, aber interessieren würde es mich schon, wie man das hinbekommt, ohne vorher Daten über den Windows-Benutzernamen und Standardpfade in einer Datei abzulegen. |
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Zitat:
![]() Zusammen mit ![]() |
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Delphi-Quellcode:
{-----------------------------------------------------------------------------
Project : - Description : Enhancement of TRegistry for impersonating the registry Author : Michael Puff [http//michael-puff.de] Date : 2012-01-05 -----------------------------------------------------------------------------} unit RegistryEx; interface uses Windows, SysUtils, Registry; type TRegistryEx = class(TRegistry) private FUser: string; FPassword: String; function Impersonate: Boolean; public destructor Destroy; override; procedure ImpersonateUser(UserName: string; Password: string); end; implementation { TRegistryEx } destructor TRegistryEx.Destroy; begin if not RevertToSelf then Halt; // if revert fails kill process for safty reason inherited; end; procedure TRegistryEx.ImpersonateUser(UserName: string; Password: string); begin FUser := UserName; FPassword := Password; if not Impersonate then RaiseLastOSError; end; function TRegistryEx.Impersonate: Boolean; var LogonType : Integer; LogonProvider : Integer; TokenHandle : THandle; begin LogonType := LOGON32_LOGON_INTERACTIVE; LogonProvider := LOGON32_PROVIDER_DEFAULT or LOGON32_PROVIDER_WINNT50; Result := LogonUser(PChar(FUser), nil, PChar(FPassword), LogonType, LogonProvider, TokenHandle); if Result then begin Result := ImpersonateLoggedOnUser(TokenHandle); CloseHandle(TokenHandle); end; end; end.
Delphi-Quellcode:
Probier das mal. Habe es eben nur mal blind getippt, kann es leider hier nicht testen.
uses
RegistryEx; procedure TForm1.btn1Click(Sender: TObject); var reg: TRegistryEx; begin reg := TRegistryEx.Create; try reg.ImpersonateUser('user', 'pw'); finally reg.Free; end; end; |
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Hallo Luckie,
auch Dir ein erfolgreiches 2012! Ich danke Dir für den Hinweis und die superschnelle Umsetzung eines Beispiel-Codes. Ich habe es jetzt auch noch nicht getestet. Nur wie ich die Sache sehe, benötige ich doch wieder den Benutzernamen des eingeschränkten Nutzers. Den weiß das Programm doch aber nicht, wenn es sofort als Admin gestartet wird. Besser wäre es doch, wenn ich den Benutzernamen des tatsächlich geöffneten Windows-Benutzers erhalte, obwohl ich die Software als Admin starte. Sonst habe ich nur wieder den Admin-Nutzernamen. Oder verstehe ich das jetzt falsch? |
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Natürlich brauchst du Name und Passwort des Benutzers auf dessen Registry Hive zu zugreifen willst. Sonst könnte ja jeder als Administrator agieren. Und was ist für dich der "tatsächlich geöffneten Windows-Benutzer"? An einem Windows System können viele Benutzer angemeldet sein und arbeiten. Woher soll das Programm wissen, welcher Benutzer gemeint ist? Wenn ein Benutzer ein Programm unter anderen Konto startet, dann ist das für das gestartete Programm so, als ob der Nutzer mit dem andren Konto es gestartet hätte.
|
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Code:
Das wollte ich doch nur wissen :) Ich dachte, es gäbe eine Möglichkeit, dies auszulesen. So in der Art: das Adminkonto wurde von einem eingeschränkten Benutzerkonto, wie hieß das?
Wenn ein Benutzer ein Programm unter anderen Konto startet, dann ist das für das gestartete Programm so, als ob der Nutzer mit dem andren Konto es gestartet hätte.
Dem ist also nicht so! Somit steht also fest, dass Programme, die unter einem eingeschränkten Windows-Nutzer ohne Adminrechte als "Administrator ausgeführt" werden, nie richtig funkionieren werden, wenn sie eigentlich auf die Nutzer-Registry zugreifen müssen, oder Nutzzer-Standardpfade %UserProfiles%, %Documents% bzw. den Desktop CSIDL_DESKTOPDIRECTORY auslesen müssen. Denn dann erhält man immer die Daten des Adminkontos. Ist das korrekt? |
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Starte doch einfach mal cmd.exe als Administrator und schau, was SET so ausgibt.
|
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Man könnte höchstens den Benutzer des Elternsprozesses ermitteln. Aber dann fehlt dir ja immer noch das Passwort.
|
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Es gibt schon einen Grund warum das so ist und der heißt Malware. Aber um Dien Problem einigermaßen zu umschiffen, kannst Du Luckies Vorschlag nutzen oder eine StartUp-Schicht einfügen, welche die benötigten Daten sammelt, wozu jedoch nicht das Admin-Passowrt gehört. Daher wurdest Du gleich zu Beginn dieses Threads auch immer wieder gefragt, ob Du den Admin nerven möchtest, wenn er immer wieder sein Passwort eingeben muss.
An dieser Stelle solltest Du jedoch auch bedenken, dass dieses Vorgehen ein erhöhtes Sicherheitsrisiko bedeutet. Immerhin hast Du extra ein eingeschränktes User-Konto für den Internet-Zugriff erstellt und möchtest dieses nun die ganze Zeit über wieder umgehen. Wenn Du Dir nun einen Trojaner eingehandelt hast, der einen Keylogger nachinstalliert, dann hast Du auf diese Weise möglicherweise soeben Deinen Rechner kapern lassen. Denk mal drüber nach. :vernupft: |
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Ich habe gerade alles durchgelesen und verstehe immernoch nichts.
Krze Fragen: 1. Windows XP oder Vista oder 7? 2. Es läuft irgendein SQL Server als Dienst. Den willst du starten und stoppen als Admin? 3. Du willst auf die Registry des Benutzers zugreifen. Dort stehen irgendwelche Einstellungen drin? Ich folgere: Du hast ein Programm, das kann ohne Adminrechte irgend etwas machen (z.B. Registry des Users benutzen). Aber manchmal willst du darin auch den SQL Server steuern (starten/stoppen). Dafür brauchst du Adminrechte. Deshalb muss der Benutzer derzeit schon von Anfang an dein Programm als Admin starten. Aber dann kannst du die Benutzereinstellungen des normalen Benutzers nicht nutzen, sondern nur vom Admin. Alles korrekt? Jetzt kommt Frage 1 ins Spiel: Ich verstehe nicht, wie keiner danach fragen konnte? Unter XP ist der Administrator ein eigenes Benutzerkonto mit eigener Registry. Ab Vista ist ein Administrator erst einmal ein normaler User und wird durch eine Abfrage an den Nutzer (UAC) für einen Prozess zum Admin. Aber es gibt auch Benutzer, die keine Admins sind und bei denen wieder ein echter Admin sich anmelden muss, der dann natürlich wie in XP mit eigener Registry ankommt. Für Vista ist die Lösung einfach. Baue den Code für die SQL Serversteuerung aus der Anwendung aus und setze sie in eine COM-DLL (nennt sich COM Elevation Moniker). Mit Windows kann diese DLL als Admin ausgeführt werden, ohne dass dein Prozess dazu Adminrechte braucht. In XP geht es leider nicht. Stattdessen musst du einen neuen Prozess mit Adminrechten (z.B. ShellExecute und Verb = runas) starten, der eben den SQL Server stoppt/startet. Du kannst z.B. deiner Anwendung Kommandozeilenparameter verpassen, um dies zu machen und dann eben die eigene Anwendung kurzzeitig nochmal sicht selbst starten lassen (über Verb = runas). Über den Prozessrückgabewert kannst du Fehler prüfen oder auch eine Kommunikation über Pipes, Events und MemoryMapped Files herstellen. Die Sache ist also einfach: Dein Prozess läuft ohne Admin und startet dann kurzzeitig einen weiteren Prozess mit Adminrechten, der die SQL Serversteuerung übernimmt: Teile und herrsche |
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Zitat:
Zitat:
ich danke Dir auch für die ausführliche Erläuterung zur Problemlösung, die ich bei Gelegenheit einmal ausprobieren werde. Wie gesagt, derzeit habe ich eine andere Lösung gefunden. Die Lösung mit runas als separates Programm kam mir auch in den Sinn. Zitat:
|
AW: Zugriff auf Registry eines eingeschränkten Benutzerkontos mit Adminrechten
Sry, hab ich wohl überlesen. Ich sehe nicht, dass du eine Lösung gepostet hättest.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:13 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