【发布时间】:2011-10-22 02:47:42
【问题描述】:
我用 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;如果不是,则为 False。 现在,如果结果为 False,我想自动将程序提升为管理员。
我尝试将清单提升到管理员,但如果我启动应用程序,我会看到 UAC 提示,如果我回答“否”,那么应用程序将根本不会运行。
有没有帮助的机会?
我需要管理员权限才能对物理驱动器进行原始访问。
编辑:
我还尝试从代码中仅禁用此应用程序的 UAC (ParamStr(0))(按下“禁用此应用程序的 UAC”按钮后)。
【问题讨论】:
-
那么只有拥有管理权限的用户才能使用你的应用程序?我与我的用户群一起使用它的应用程序来避免像瘟疫一样。关于 UAC 的附加说明,如果用户无法通过 UAC 提示进行提升,则提示必须向他们展示使用备用用户名和密码进行提升的能力。这不是您在问题中考虑的问题。
-
> "所以只有拥有管理权限的用户才能使用您的应用程序?"不,我只会通知用户一些危险的功能
-
@wcale - 如果您的程序可以绕过 UAC 并让自己在管理员范围内运行,那么 UAC 将毫无意义,不是吗?
-
@techie007 - 是的,但是您必须在此应用程序(加密应用程序)或密钥中输入密码,然后启用隐藏驱动器...如果应用程序重新启动,则用户必须再次输入所有这些。我可以禁用整个系统的 UAC 检查,但我不想这样做。
标签: windows security administrator uac delphi