如何以编程方式更改文件关联而不需要提升

时间:2011-01-03 14:06:58

标签: delphi registry file-association

如果用户 具有管理员/提升权限(Win XP,Vista,7),如何以编程方式更改文件关联?关于如何解决这个问题的任何想法?基本上我想保持我的应用程序像现在一样精简(它不需要提升权限来安装和运行)。 目前我提供了一个GUI界面,用户可以在其中更改文件关联,但如果用户权限有限,那么它只会显示一条消息,表明它无法执行此操作,并向其解释如何激活“运行此程序”作为管理员“框然后重新启动该程序。如果用户拥有权限,那么我只需更改关联。

有更好的方法来保持'精简'吗?

4 个答案:

答案 0 :(得分:10)

在Windows中(自Windows 2000起),您可以拥有系统范围的文件关联,这需要设置提升的权限,以及每个用户文件关联。

如果您想保留 lite ,请建立per_user文件关联,就是这样。

看一下这篇文章:Changes in File Types and File Association Features in Windows 2000 and Windows Server 2003

答案 1 :(得分:2)

您可以使用ShellExecute生成外部实用程序。确保在操作中包含Shield图标,以表明它需要提升权限。然后它会提示用户并让他们知道它需要特殊权限。

您可以做的一件事是向您自己的应用程序添加标志,表明它将更改权限。然后使用特殊标志再次运行您的应用程序。

例如,如果您的申请是

MyApplication.exe

你可以产生

MyApplication.exe / setfiles

只会设置文件关联然后退出。这样你只需要发送一个可执行文件。

function RunAsAdmin(hWnd: HWND; filename: string; Parameters: string): Boolean;
var
    sei: TShellExecuteInfo;
begin
    ZeroMemory(@sei, SizeOf(sei));
    sei.cbSize := SizeOf(TShellExecuteInfo);
    sei.Wnd := hwnd;
    sei.fMask := SEE_MASK_FLAG_DDEWAIT or SEE_MASK_FLAG_NO_UI;
    sei.lpVerb := PChar('runas');
    sei.lpFile := PChar(Filename); // PAnsiChar;
    if parameters <> '' then
        sei.lpParameters := PChar(parameters); // PAnsiChar;
    sei.nShow := SW_SHOWNORMAL; //Integer;
    Result := ShellExecuteEx(@sei);
end;

答案 2 :(得分:1)

我的解决方案(等待更好的替代方案):

看起来只有管理员可以全局更改关联。从这个角度来看,我现在可以想象的最好的方法(但是甚至不是完美的)是创建一个小的外部实用工具,隐含地以提升的权限运行。然后,此工具将更改关联。当然,没有提升权限的用户仍然无法更改关联。

答案 3 :(得分:0)

你可以在这个地方找到一个使用注册表的解决方案(操作系统是Windows XP) - 因此它可能不适用于你的请求:http://volvox.wordpress.com/2006/06/02/extensions-101/ - 对不起它是法语...完整的来源(有详细记录)和可执行文件下载。