4

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

有更好的方法来做到这一点并保持“精简”吗?

4

4 回答 4

10

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

如果您想保持精简,请建立 per_user 文件关联,仅此而已。

查看这篇文章:Windows 2000 和 Windows Server 2003 中文件类型和文件关联功能的变化

于 2011-01-03T14:14:15.587 回答
2

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

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

例如,如果您的应用程序是

我的应用程序.exe

你可以产卵

我的应用程序.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;
于 2011-01-03T14:23:20.540 回答
1

我的解决方案(等待更好的选择):

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

于 2011-01-03T14:11:24.667 回答
0

You can find a solution at this place using the registry (OS is Windows XP) - so it may not be applicable to your request : http://volvox.wordpress.com/2006/06/02/extensions-101/ - Sorry it's in french ... Complete sources (well documented) and executable to download.

于 2011-01-03T19:44:27.837 回答