Delphi 判断exe是否以管理员身份启动

  1 1:获取程序运行的用户名
  2 function GetProcessIdentity(): String;
  3 var
  4   hToken: THandle;
  5   UserName, UserDomain: String;
  6   cbName, cbDomainName: ULONG;
  7   ReturnLength: DWORD;
  8   Buff: array of Byte;
  9   tu: PTokenUser;
 10   peUse: SID_NAME_USE;
 11 label
 12   Cleanup;
 13 begin
 14   Result := ‘‘;
 15   // 打开进程令牌
 16   if not OpenProcessToken(GetCurrentProcess, MAXIMUM_ALLOWED, hToken) then Exit;
 17
 18   // 查询用户账户令牌
 19
 20   // 首先获取需要的缓冲区大小
 21   if not GetTokenInformation(hToken, TokenUser, nil, 0, ReturnLength) then
 22     if GetLastError = ERROR_INSUFFICIENT_BUFFER then
 23     begin
 24       // 设置缓冲区大小
 25       SetLength(Buff, ReturnLength);
 26       // 获取数据
 27       GetTokenInformation(hToken, TokenUser, @Buff[0], ReturnLength, ReturnLength);
 28       tu := PTokenUser(@Buff[0]);
 29     end
 30     else
 31       goto Cleanup
 32   else
 33     goto Cleanup;
 34
 35   // 通过 SID 查询用户名及登陆域
 36   cbName := 0;
 37   cbDomainName := 0;
 38   // 获取需要的缓冲区大小
 39   if not LookupAccountSid(nil, tu.User.Sid, nil, cbName, nil, cbDomainName, peUse) then
 40     if GetLastError = ERROR_INSUFFICIENT_BUFFER then
 41     begin
 42       // 设置字符串长度(包含 NULL 字符)
 43       SetLength(UserName, cbName);
 44       SetLength(UserDomain, cbDomainName);
 45       // 获取数据
 46       if LookupAccountSid(nil, tu.User.Sid, @UserName[1], cbName, @UserDomain[1], cbDomainName, peUse) then
 47       begin
 48         // 截去最后的 NULL 字符
 49         SetLength(UserName, cbName);
 50         SetLength(UserDomain, cbDomainName);
 51       end
 52       else
 53         goto Cleanup;
 54     end
 55     else
 56       goto Cleanup
 57   else
 58     goto Cleanup;
 59
 60   // 组合信息
 61   Result := UserDomain + ‘\‘ + UserName;
 62
 63 Cleanup:
 64   // 关闭令牌
 65   CloseHandle(hToken);
 66 end;
 67
 68 2:获取用户是否以管理员模式运行
 69 function GetProcessIsAdmin(): Boolean;
 70 var
 71   hToken: THandle;
 72   UserName, UserDomain: String;
 73   cbName, cbDomainName: ULONG;
 74   ReturnLength: DWORD;
 75   Buff: array of Byte;
 76   BuffA: array[0..3] of Byte;
 77   tu: PTokenElevation;
 78   peUse: SID_NAME_USE;
 79   te:PTokenElevation;
 80 begin
 81   Result := False;
 82   if not OpenProcessToken(GetCurrentProcess, MAXIMUM_ALLOWED, hToken) then Exit;
 83   // 查询用户账户令牌
 84   // 首先获取需要的缓冲区大小
 85   if not GetTokenInformation(hToken, TokenElevation, @BuffA[0], 4, ReturnLength) then
 86   begin
 87     if GetLastError = ERROR_INSUFFICIENT_BUFFER then
 88     begin
 89       // 设置缓冲区大小
 90       SetLength(Buff, ReturnLength);
 91       // 获取数据
 92       GetTokenInformation(hToken, TokenElevation, @Buff[0], ReturnLength, ReturnLength);
 93       tu := PTokenElevation(@Buff[0]);
 94       Result:=tu.TokenIsElevated=1;
 95     end ;
 96   end else
 97   begin
 98     tu := PTokenElevation(@BuffA[0]);
 99     Result:=tu.TokenIsElevated=1;
100   end;
101   // 关闭令牌
102   CloseHandle(hToken);
103 end;

用Delphi编写的exe,vista系统及以上系统,启动exe需要管理员权限只要添加uac,xp系统不支持uac,需要判断是否是管理员身份启动。

 1 var
 2   mutex: HWND;
 3
 4 begin
 5   if not GetProcessIsAdmin() then     //判断是否以管理员启动
 6   begin
 7     Application.MessageBox(‘请以管理员身份启动‘, ‘警告‘, MB_ICONWARNING + MB_OK);
 8   end
 9   else
10   begin
11     mutex := CreateMutex(nil, False, ‘Global\xxx’);   { 创建单一实例 }
12     if ((mutex <> 0) and (GetLastError() = ERROR_ALREADY_EXISTS)) then
13     begin
14       Application.MessageBox(‘程序已经运行‘, ‘警告‘, MB_ICONWARNING + MB_OK);
15     end
16     else
17     begin
18       Application.Initialize;
19       Application.MainFormOnTaskbar := True;
20       Application.Title := ‘xxx‘;
21       Application.CreateForm(TfrmMain, frmMain);
22       Application.ShowMainForm := False;
23       Application.Run;
24     end;
25   end;
26 end.

单一实例的判断。

时间: 2024-10-08 16:35:57

Delphi 判断exe是否以管理员身份启动的相关文章

Delphi生成EXE自动以管理员身份运行

[测试环境]Windows 7 旗舰版 With Sp1,RAD 10 Seattle 1.文本文件:UAC.manifest <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

win8中让cmd.exe始终以管理员身份运行

最近在学习配置本地服务器,在命令行启动mysql时总是由于权限不足而失败, 查了好多方法,终于找到一劳永逸的方法了. Win+R -- cmd ,这样总是不能,还要找到cmd.exe右键以管理员身份运行cmd,再 net start mysql才可以. 每次都这样相当麻烦,能不能默认就让cmd.exe以管理员身份来运行呢? 答案是可以的. Win+R -- regedit 找到以下位置 HKEY_CURRENT_USER\Software\Microsoft\Windows NT\Current

windows下 管理员身份启动java进程

winXp,win2003等老操作系统没有区分管理员身份启动cmd运行程序, win vista,7之后的windows操作系统都有是否以管理员身份启动cmd运行程序.官方的说法是为了安全性.java 项目主服务另外启动一个进程一般用 Runtime.getRuntime().exec(command)来启动. xp,2003系统中一般不会有问题, win7之类的就会提示权限不够,必须以管理员身份运行程序. 查了下,可以通过nircmd这个工具来执行,官网下载zip(http://www.nir

如何跳过UAC以管理员身份启动程序

往往我们要用管理员身份去运行一个程序的时候,总是要有一个提示框: 可能会有用户选择禁用UAC,但这毕竟对系统的安全存在影响.下面就用一个简单的方法解决这个问题.该方法就是利用系统自带的任务计划程序来实现的. 一.创建一个任务来运行你所要运行的程序 找到任务计划程序. 方式一.开始菜单->附件->系统工具->任务计划程序: 方式二.直接在开始菜单的搜索栏中输入"任务计划程序"也可以找到: 方式三.运行(win+r)输入"taskschd.msc".

delphi 判断exe重复执行

var hAppMutex: THandle; //声明互斥变量begin hAppMutex := CreateMutex(nil, false,'WMS');// WMS应用程序名称 if ((hAppMutex <> 0) and (GetLastError() = ERROR_ALREADY_EXISTS)) then begin      MessageBox(APPLICATION.handle,'程序已经运行,不能同时打开多个工程!','提示',MB_OK); exit; end

Windows 8上强制Visual Studio以管理员身份运行

Windows 8上强制Visual Studio以管理员身份运行 Windows 8的一个既安全又蛋疼之处是UAC的行为被改变了.以往在Windows 7中,只要关闭了UAC,自己的帐号又是本机管理员组的,任何程序都会以管理员身份启动.然而,在Windows 8上,我们不能关闭UAC,那样的话Metro程序就一个都启动不了了. 作为微软技术的码农,我们通常要让Visual Studio在管理员权限下跑.虽然我们可以每次都在右键菜单里选择"以管理员身份运行",但多此一举的动作总是很蛋疼

转:Windows 8上强制Visual Studio以管理员身份运行

Windows 8的一个既安全又蛋疼之处是UAC的行为被改变了.以往在Windows 7中,只要关闭了UAC,自己的帐号又是本机管理员组的,任何程序都会以管理员身份启动.然而,在Windows 8上,我们不能关闭UAC,那样的话Metro程序就一个都启动不了了. 作为微软技术的码农,我们通常要让Visual Studio在管理员权限下跑.虽然我们可以每次都在右键菜单里选择"以管理员身份运行",但多此一举的动作总是很蛋疼.经过一番开荒,我终于找到了如何强制以管理员身份启动VS的办法. 网

indows 8上强制Visual Studio以管理员身份运行

http://diaosbook.com/Post/2013/2/28/force-visual-studio-always-run-as-admin-on-windows-8 Windows 8的一个既安全又蛋疼之处是UAC的行为被改变了.以往在Windows 7中,只要关闭了UAC,自己的帐号又是本机管理员组的,任何程序都会以管理员身份启动.然而,在Windows 8上,我们不能关闭UAC,那样的话Metro程序就一个都启动不了了. 作为微软技术的码农,我们通常要让Visual Studio

Windows 10 上强制Visual Studio以管理员身份运行

Windows 10 的一个既安全又蛋疼之处是UAC的行为被改变了.以往在Windows 7中,只要关闭了UAC,自己的帐号又是本机管理员组的,任何程序都会以管理员身份启动.然而,在Windows 8上,我们不能关闭UAC,那样的话Metro程序就一个都启动不了了. 作为微软技术的码农,我们通常要让Visual Studio在管理员权限下跑.虽然我们可以每次都在右键菜单里选择"以管理员身份运行",但多此一举的动作总是很蛋疼.经过一番开荒,我终于找到了如何强制以管理员身份启动VS的办法.