UAC+Manifest

Manifest指明程序运行权限

  既然微软的启发式安装程序检测这么弱智,那么我们只好自己麻烦一下,简单地为应用程序添加一个Manifest文件,告诉操作系统我们到底是不是安装程序,是否需要请求管理员权限。如果应用程序的源代码无法获得,我们只需要在应用程序的同一目录下为应用程序添加一个外部Manifest文件。这个Manifest文件的名字应该是应用程序文件名加上“.manifest”后缀。例如,StockUpdater.exe的Manifest文件的文件名应该是StockUpdater.exe.manifest。这个Manifest文件应该指明此应用程序在运行的时候是否需要申请管理员权限,或者是否在普通用户权限下就可以正常运行。

  一个典型的外部Manifest文件如下所示:

 

 

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

 

<?xmlversion="1.0"encoding="utf-8"?>

<asmv1:assemblymanifestVersion="1.0"xmlns="urn:schemas-microsoft-com:asm.v1"xmlns:asmv1="urn:schemas-microsoft-com:asm.v1"xmlns:asmv2="urn:schemas-microsoft-com:asm.v2"xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance">

<assemblyIdentityversion="1.0.0.0"name="MyApplication.app"/>

<trustInfoxmlns="urn:schemas-microsoft-com:asm.v2">

<security>

<requestedPrivilegesxmlns="urn:schemas-microsoft-com:asm.v3">

<!-- UAC Manifest 选项

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

<requestedExecutionLevel level="highestAvailable" uiAccess="false" />

-->

 

<requestedExecutionLevellevel="asInvoker"uiAccess="false" />

</requestedPrivileges>

 

</security>

</trustInfo>

</asmv1:assembly>

  其中,requestedExecutionLevel属性就表示我们的应用程序正确执行所需要的权限。它有这样几个可选值:

  • asInvoker – 它表示应用程序需要跟创建者相同的权限运行。也就是跟Windows Explorer相同的权限运行,通常就是普通用户权限。这个应用程序不是安装程序并且不会被启发式安装程序检测错误地标记。

  • requireAdministrator – 它表示这个应用程序需要管理员权限才能正常运行。(它可能是一个安装程序。)

  • highestAvailable – 它表示这个应用程序应该以尽可能高的权限运行。如果当前用户是一个管理员用户,那么它就等同于requireAdministrator 。如果当前用户是普通用户,那么它会在运行的时候请求管理员权限。

  当我们为应用程序添加外部Manifest文件后,操作系统会根据Manifest文件中的定义为应用程序制定相应的UAC规则。例如,我们可以通过外部Manifest文件,为一个自定义的安装程序在执行时请求管理员权限。

嵌入式Manifest

  如果我们可以获得应用程序的源代码,我们可以在Visual Studio 2010中为应用程序添加嵌入式的Manifest来完成相同的工作。在项目属性中,我们设置“Linker->Manifest File->UAC Execution Level”,就可以指定应用程序执行所需要的权限。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用Delphi编写程序时,添加UAC(User Account Control)可以提高程序的安全性。UACWindows操作系统中的一种安全机制,可以防止程序在没有管理员权限的情况下对系统进行更改,因此添加UAC是非常必要的。 首先,需要在程序的清单文件(.manifest)中添加UAC请求,声明程序需要管理员权限才能运行。在Delphi中,可以通过添加一个res文件来实现。将以下代码复制到文本编辑器中,另存为一个名为“程序名.res”的文件。 {$R 'UAC.res' 'UAC.rc'} 其中,UAC.rc文件的内容如下: 1 RT_MANIFEST "UAC.manifest" 在程序中,需要添加一段代码来检查当前用户是否为管理员,并为程序请求管理员权限。这可以通过WinAPI函数来实现。 在程序中添加以下代码: uses ShellAPI; function IsAdmin: Boolean; begin Result := False; {$IFDEF MSWINDOWS} Result := CheckTokenMembership(0, {$IFDEF FPC}Winapi.{%H-}{$ENDIF}PSID(1), Result); {$ENDIF} end; procedure RunAsAdmin(const aHandle: HWND; const aFile, aParameters: string); var sei: TShellExecuteInfo; begin ZeroMemory(@sei, SizeOf(sei)); sei.cbSize := SizeOf(TShellExecuteInfo); sei.fMask := SEE_MASK_NOCLOSEPROCESS; sei.Wnd := aHandle; sei.lpVerb := 'runas'; sei.lpFile := PChar(aFile); sei.lpParameters := PChar(aParameters); sei.nShow := SW_SHOWNORMAL; if ShellExecuteEx(@sei) then WaitForInputIdle(sei.hProcess, INFINITE); end; 然后,可以在程序的入口处(如FormCreate)添加以下代码来检查当前用户是否有管理员权限: if not IsAdmin then RunAsAdmin(Application.Handle, ParamStr(0), ''); 这将在程序开始时检查当前用户是否为管理员,如果不是,将弹出UAC提示框,请求用户授权。 通过以上步骤,就可以为Delphi程序添加UAC,提高程序的安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值