[Delphi] ImpersonateLoggedOnUser

Pagina: 1
Acties:
  • 82 views sinds 30-01-2008

  • DiGuru
  • Registratie: April 2003
  • Laatst online: 05-09-2008
Ik gebruik de SU service om applicaties te installeren op workstations, maar dat geeft veel problemen en is zeer beperkt. Ik kan bijvoorbeeld alleen nieuwe processen opstarten, dus als ik iets speciaals wil doen, moet ik daar eerst een programma voor schrijven. Ook draait dat nieuwe process met het profiel van die admin, niet de huidige gebruiker. Dat is zeer lastig.

Onder W2000/XP is er een functie, CreateProcessWithLogonW, die ik kan gebruiken in plaats van de SU service, maar dan moet ik nog steeds meerdere losse programmaatjes maken om alle specifieke functies uit te voeren. En een heleboel workstations draaien nog op NT, dus dat is geen oplossing.

Ik heb een encrypted bestand met daarin de username en het password van de domain admin. Dus ik kan zonder meer met LogonUser een nieuw token maken met domain admin rechten. Maar daarmee kan ik geen CreateProcessAsUser doen: daar heeft de huidige gebruiker niet voldoende rechten voor.

Ik moet dus eerst met AdjustTokenPrivileges de huidige privileges van de gebruiker wat opschroeven. Dat lijkt te werken, maar dan heb ik nog steeds niet voldoende rechten. Het werkt zelfs niet als ik inlog als administrator! Wat doe ik fout?

Eigenlijk wil ik met ImpersonateLoggedOnUser de rechten van het programma zelf opschroeven tot admin niveau, dan kan ik rechtstreeks doen wat ik wil. En ik kan dan zelf bepalen welk profiel er gebruikt wordt. Maar dat geeft dezelfde foutmeldingen.

Het is dus geen kraakprogramma of iets dergelijks, de domain admin moet zelf de encrypted file met zijn username en password aanmaken, anders werkt het niet. Nou zou je dat theoretisch niet eens nodig hebben, want als je met SnifferPro een kixtart sessie bekijkt, dan zie je dat hij dat kan zonder een userID of password. Maar ik wil het graag netjes en beheersbaar houden.

Weet iemand hoe ik met ImpersonateLoggedOnUser mijn programma admin rechten kan geven als ik de username en het password weet?

  • DiGuru
  • Registratie: April 2003
  • Laatst online: 05-09-2008
Niemand?

  • DiGuru
  • Registratie: April 2003
  • Laatst online: 05-09-2008
Voor zover ik heb kunnen ontdekken, moet ik eerst op slinkse wijze het systeem hacken en mijn rechten omhoogvijzelen tot admin niveau, voordat ik van deze functies gebruik kan maken. Maar dan heb ik ze niet meer nodig. Dat moet ik dan maar doen.

En die username en password van een domain admin heb ik dan niet nodig, daar heb ik toch niets aan.

Wat een zooi, dat Windows. Zucht.

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02-2025

SchizoDuckie

Kwaak

DiGuru schreef op 12 June 2003 @ 16:29:
Voor zover ik heb kunnen ontdekken, moet ik eerst op slinkse wijze het systeem hacken en mijn rechten omhoogvijzelen tot admin niveau, voordat ik van deze functies gebruik kan maken. Maar dan heb ik ze niet meer nodig. Dat moet ik dan maar doen.

En die username en password van een domain admin heb ik dan niet nodig, daar heb ik toch niets aan.

Wat een zooi, dat Windows. Zucht.
lijkt me een beetje smack als je het systeem zo kan hacken als het dichtgetimmerd is :{

Stop uploading passwords to Github!


  • DiGuru
  • Registratie: April 2003
  • Laatst online: 05-09-2008
Papa Eend schreef op 12 June 2003 @ 16:34:
[...]

lijkt me een beetje smack als je het systeem zo kan hacken als het dichtgetimmerd is :{
Weet je een betere oplossing? We kunnen ook alle gebruikers admin rechten geven, maar daar gaan de beheerders zeker niet mee akkoord.

KiXtart en een bibliotheek die ik nu gebruik doen dat ook om bijvoorbeeld op de server op te vragen van welke groepen een gebruiker lid is. Daar heb je namelijk ook adminrechten voor nodig.

Edit: als je een service maakt draait die normaal met system rechten, dat is ruwweg gelijk aan de rechten van de lokale admin.

[ Voor 11% gewijzigd door DiGuru op 12-06-2003 17:05 ]


  • DiGuru
  • Registratie: April 2003
  • Laatst online: 05-09-2008
Ik heb nu een applicatie gemaakt die een service installeert. Die service start zichzelf, voert een aktie uit, stopt en verwijderd zichzelf. Dat duurt allemaal ongeveer 1 seconde.

Nou kijken of ik daarmee voldoende rechten heb.

  • DiGuru
  • Registratie: April 2003
  • Laatst online: 05-09-2008
Op zich heel leuk, dit is de code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
unit Service;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
  extctrls, WinSvc;

const
  LogFile: string = 'c:\test.log';

type
  TGEMService = class(TService)
    procedure ServiceAfterInstall(Sender: TService);
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
    procedure ServicePause(Sender: TService; var Paused: Boolean);
    procedure ServiceContinue(Sender: TService; var Continued: Boolean);
  private
    { Private declarations }
  public
    function GetServiceController: TServiceController; override;
    { Public declarations }
  end;

var
  GEMService: TGEMService;

implementation

{$R *.DFM}

procedure Log(s: string);
var
  f: TextFile;
begin
  if LogFile <> '' then
  begin
    {$I-}
    if FileExists(LogFile) then
    begin
      AssignFile(f, LogFile);
      Append(f);
    end
    else
    begin
      AssignFile(f, LogFile);
      Rewrite(f);
    end;
    if (IOResult = 0) then
    begin
      Writeln(f, s);
      Flush(f);
      CloseFile(f);
    end;
    {$I+}
  end;
end;

function StartThisService(sMachine, sService : string ) : boolean;
var
  schm,
  schs   : SC_Handle;
  ss     : TServiceStatus;
  psTemp : PChar;
  dwChkP : DWord;
begin
  schm := OpenSCManager(PChar(sMachine), Nil, SC_MANAGER_CONNECT);
  if(schm > 0)then
  begin
    schs := OpenService(schm, PChar(sService), SERVICE_START or 
                        SERVICE_QUERY_STATUS);
    if(schs > 0)then
    begin
      psTemp := Nil;
      if(StartService(schs, 0, psTemp))then
      begin
        if(QueryServiceStatus(schs, ss))then
        begin
          while(SERVICE_RUNNING <> ss.dwCurrentState)do
          begin
            dwChkP := ss.dwCheckPoint;
            Sleep(ss.dwWaitHint);
            if(not QueryServiceStatus(schs, ss))then
            begin
              break;
            end;
            if(ss.dwCheckPoint < dwChkP)then
            begin
              break;
            end;
          end;
        end;
      end;
      CloseServiceHandle(schs);
    end;
    CloseServiceHandle(schm);
  end;
  Result := SERVICE_RUNNING = ss.dwCurrentState;
end;

function StopThisService(sMachine, sService : string ) : boolean;
var
  schm,
  schs   : SC_Handle;
  ss     : TServiceStatus;
  dwChkP : DWord;
begin
  schm := OpenSCManager(PChar(sMachine), Nil, SC_MANAGER_CONNECT);
  if(schm > 0)then
  begin
    schs := OpenService(schm, PChar(sService),  SERVICE_STOP or
                        SERVICE_QUERY_STATUS);
    if(schs > 0)then
    begin
      if(ControlService(schs, SERVICE_CONTROL_STOP, ss))then
      begin
        if(QueryServiceStatus(schs, ss))then
        begin
          while(SERVICE_STOPPED <> ss.dwCurrentState)do
          begin
            dwChkP := ss.dwCheckPoint;
            Sleep(ss.dwWaitHint);
            if(not QueryServiceStatus(schs, ss))then
            begin
              break;
            end;

            if(ss.dwCheckPoint < dwChkP)then
            begin
              break;
            end;
          end;
        end;
      end;
      CloseServiceHandle(schs);
    end;
    CloseServiceHandle(schm);
  end;
  Result := SERVICE_STOPPED = ss.dwCurrentState;
end;

procedure DeleteThisService(sMachine, sService: string);
var
  schm,
  schs   : SC_Handle;
begin
  schm := OpenSCManager(PChar(sMachine), Nil, SC_MANAGER_CONNECT);
  if(schm > 0)then
  begin
    schs := OpenService(schm, PChar(sService), STANDARD_RIGHTS_REQUIRED);
    if(schs > 0)then
    begin
      DeleteService(schs);
      CloseServiceHandle(schs);
    end;
    CloseServiceHandle(schm);
  end;
end;

function QueryThisService(sMachine, sService : string ) : DWORD;
var
  schm,
  schs   : SC_Handle;
  ss     : TServiceStatus;
begin
  Result := SERVICE_STOPPED;
  schm := OpenSCManager(PChar(sMachine), Nil, SC_MANAGER_CONNECT);
  if(schm > 0)then
  begin
    schs := OpenService(schm, PChar(sService), SERVICE_QUERY_STATUS);
    if(schs > 0)then
    begin
      if QueryServiceStatus(schs, ss) then
      begin
        Result := ss.dwCurrentState;
      end;
      CloseServiceHandle(schs);
    end;
    CloseServiceHandle(schm);
  end;
end;

function BoolToStr(b: Boolean): string;
begin
  if b then
  begin
    Result := 'True';
  end
  else
  begin
    Result := 'False';
  end;
end;

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  GEMService.Controller(CtrlCode);
end;

function TGEMService.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

procedure TGEMService.ServiceAfterInstall(Sender: TService);
var
  Token: THandle;
begin
  StartThisService('', 'GEMService');
  while QueryThisService('', 'GEMService') <> SERVICE_RUNNING do Sleep(10);
// Do your stuff here //
  StopThisService('', 'GEMService');
  while QueryThisService('', 'GEMService') <> SERVICE_STOPPED do Sleep(10);
  DeleteThisService('', 'GEMService');
end;

procedure TGEMService.ServiceStart(Sender: TService; var Started: Boolean);
begin
  Started := True;
end;

procedure TGEMService.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  Stopped := True;
end;

procedure TGEMService.ServicePause(Sender: TService; var Paused: Boolean);
begin
  Paused := True;
end;

procedure TGEMService.ServiceContinue(Sender: TService;
  var Continued: Boolean);
begin
  Continued := True;
end;

end.

[ Voor 3% gewijzigd door DiGuru op 12-06-2003 23:37 ]


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Ik kan tellen, jij kan lezen ? Lees de FAQ.

( gesloten wegens topic schoppen )

[ Voor 32% gewijzigd door dusty op 12-06-2003 23:41 ]

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR

Pagina: 1

Dit topic is gesloten.