我在Delphi 7 for Windows 7中编写的应用程序需要管理员权限才能使用某些功能。如何从源代码中将其提升为管理员?
我使用以下代码检查用户权限:
function IsUserAdmin : boolean;
const CAdminSia : TSidIdentifierAuthority = (value: (0, 0, 0, 0, 0, 5));
var sid : PSid;
ctm : function (token: dword; sid: pointer; var isMember: bool) : bool; stdcall;
b1 : bool;
begin
result := false;
ctm := GetProcAddress(LoadLibrary('advapi32.dll'), 'CheckTokenMembership');
if (@ctm <> nil) and AllocateAndInitializeSid(CAdminSia, 2, $20, $220, 0, 0, 0, 0, 0, 0, sid) then
begin
result := ctm(0, sid, b1) and b1;
FreeSid(sid);
end;
end;
如果应用程序以管理员身份启动,则返回True;如果没有,那么假。 现在,如果我的结果是假,我想自动将程序提升为管理员。
我尝试使用manifest提升给管理员,但是如果我启动应用程序,那么我会看到一个UAC提示符,如果我回答“否”,那么应用程序根本不会运行。
有任何获得帮助的机会吗?
我需要管理员权限才能对物理驱动器进行原始访问。
编辑:
我还尝试从代码中禁用此应用程序(ParamStr(0))的UAC(在按下“为此应用程序禁用UAC”按钮之后)。
答案 0 :(得分:1)
如果您希望它拥有管理员权限,那么您必须通过UAC。除非禁用UAC,否则无法在没有显示UAC提示的情况下升级到管理员。显然,您必须在UAC提示符上选择YES才能获得管理员权限。
答案 1 :(得分:1)
进程在启动时接收其令牌,然后无法更改它们。因此,如果您希望应用程序看起来提升其功能的某个子集,则该功能必须涉及新流程。你不能做的是提升现有的流程。