This repository has been archived by the owner on Jul 9, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathelevate.pas
112 lines (100 loc) · 2.82 KB
/
elevate.pas
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
{*
* pasdivert
* (C) 2017, sa
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*}
unit Elevate;
interface
uses
SysUtils, Windows, ShellAPI, ComObj;
procedure RunElevated;
implementation
function CheckTokenMembership(TokenHandle: THANDLE; SidToCheck: Pointer; var IsMember: BOOL): BOOL; stdcall; external advapi32 name 'CheckTokenMembership';
const
SECURITY_NT_AUTHORITY: TSidIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5));
SECURITY_BUILTIN_DOMAIN_RID = $00000020;
DOMAIN_ALIAS_RID_ADMINS = $00000220;
function IsRunningAsAdmin: boolean;
var
dwError: DWORD;
pAdministratorsGroup: Pointer;
NtAuthority: TSIDIdentifierAuthority;
b: BOOL;
begin
Result := false;
dwError := ERROR_SUCCESS;
pAdministratorsGroup := nil;
NtAuthority := SECURITY_NT_AUTHORITY;
try
if (AllocateAndInitializeSid(
@NtAuthority,
2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
pAdministratorsGroup))
then begin
b := false;
if (CheckTokenMembership(0, pAdministratorsGroup, b)) then begin
Result := b;
end else begin
dwError := GetLastError;
end;
end else begin
dwError := GetLastError;
end;
finally
if (pAdministratorsGroup <> nil) then begin
FreeSid(pAdministratorsGroup);
end;
end;
if (dwError <> ERROR_SUCCESS) then
raise Exception.Create(SysErrorMessage(dwError));
end;
procedure RunElevated;
{$IFDEF FPC}
type
PShellExecuteInfo = ^TShellExecuteInfo;
{$ENDIF}
var
SEI: TShellExecuteInfo;
Host: string;
Args: string;
i: integer;
begin
if not IsRunningAsAdmin then begin
Host := ParamStr(0);
Args := '';
for i := 1 to ParamCount do begin
Args := Args + ' "' + ParamStr(i) + '"';
end;
Args := Trim(Args);
SEI := Default(TShellExecuteInfo);
SEI.cbSize := SizeOf(SEI);
SEI.fMask := SEE_MASK_NOCLOSEPROCESS;
{$IFDEF UNICODE}
SEI.fMask := SEI.fMask or SEE_MASK_UNICODE;
{$ENDIF}
SEI.Wnd := 0;
SEI.lpVerb := 'runas';
SEI.lpFile := PChar(Host);
SEI.lpParameters := PChar(Args);
SEI.nShow := SW_NORMAL;
if not ShellExecuteEx({$IFDEF FPC}PShellExecuteInfo{$ENDIF}(@SEI)) then
RaiseLastOSError;
Halt(0);
end;
end;
end.