一旦启动具有管理员权限的应用程序,ShellExecute在该应用程序中使用的程序将继承管理员权限.但这不是我想要的:它必须在没有额外权限的情况下定期开始.ShellExecute接受参数OPEN(常规)和RUNAS(管理员).但是,如果您OPEN在以管理员身份启动应用程序后使用它,它仍然会像RUNAS.
以下示例演示了这一点:如果您使用常规权限启动它,则会显示"Started regular".一旦你为'admin'按1,它将以管理员身份启动.如果在新创建的提示中按2,它将不会启动"常规"提示,而是再次启动"管理员"提示.
我在RUNAS(https://superuser.com/a/374866)中找到了一些关于某些参数的内容,但是它们无法传入ShellExecute.有任何想法吗?
program WindowsPrivilegeTest;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
Winapi.Windows,
Winapi.ShellAPI;
function CheckTokenMembership(TokenHandle: THANDLE; SidToCheck: Pointer; var
IsMember: BOOL): BOOL; stdcall; external advapi32 name 'CheckTokenMembership';
// Source: http://stackoverflow.com/a/28572886/1870208
function IsAdministrator: Boolean;
var
psidAdmin: Pointer;
B: BOOL;
const
SECURITY_NT_AUTHORITY: TSidIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5));
SECURITY_BUILTIN_DOMAIN_RID = $00000020;
DOMAIN_ALIAS_RID_ADMINS = $00000220;
SE_GROUP_USE_FOR_DENY_ONLY = $00000010;
begin
psidAdmin := nil;
try
Win32Check(AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0,
psidAdmin));
if CheckTokenMembership(0, psidAdmin, B) then
Result := B
else
Result := False;
finally
if psidAdmin <> nil then
FreeSid(psidAdmin);
end;
end;
var
lLine : String;
lOperation : PChar;
begin
try
if IsAdministrator then
begin
Writeln('Started as administrator');
end
else
begin
Writeln('Started regular');
end;
while True do
begin
Writeln('');
Writeln('How to start? 1 = admin, 2 = regular user. Type number and press enter');
ReadLn(lLine);
lOperation := '';
if lLine = '1' then
begin
lOperation := 'RUNAS';
end
else
if lLine = '2' then
begin
lOperation := 'OPEN';
end;
if lOperation <> '' then
begin
ShellExecute(0, lOperation, PChar(ParamStr(0)), nil, nil, SW_SHOWNORMAL);
Break;
end;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
Run Code Online (Sandbox Code Playgroud)
我曾经在创建安装程序时解决了这个难题,这是可能的解决方案之一。
这个想法是创建一个以用户权限运行的后台进程,您的主应用程序与其通信并让它知道要启动哪个程序 - 启动的进程将具有用户权限。
它应该像这样工作:后台进程像往常一样启动,并具有用户权限。启动后,它将以管理员身份启动您的主程序。后台进程保持隐藏状态并等待主进程的命令。
| 归档时间: |
|
| 查看次数: |
598 次 |
| 最近记录: |