How do I mark a shortcut file as requiring elevation? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20071219-00/?p=24103
Raymond Chen 2007年12月19日
如何将快捷方式标记为需要提升权限
简要
文章介绍了如何通过设置
SLDF_RUNAS_USER
标志,将快捷方式标记为需要提升权限。提供了一个示例程序,用于修改快捷方式属性,使其以管理员身份运行。同时提醒读者,通常应由程序本身指定提升权限需求。
正文
指定是否需要提升权限通常是程序(EXE)的责任。 这是通过在manifest清单中添加一个requestedExecutionLevel
元素来完成的。 (Bart De Smet向你展示了如何做到这一点。 Calvin Hsia对你的Visual FoxPro程序也做了同样的事情。) 但是,如果你运行的程序没有这样的清单——也许是一个你无法控制的旧程序——你可以创建一个程序的快捷方式,并将快捷方式标记为需要提升权限。
为此,你需要在快捷方式属性中设置SLDF_RUNAS_USER
标志。 下面是一个设置命令行传递的快捷方式路径上的快捷方式标志的示例程序。 为了说明问题,我省略了错误报告,并且为了增加趣味性,我使用了ATL智能指针。
#include <windows.h>
#include <shlobj.h>
#include <atlbase.h>
void MarkShortcutRunAs(LPCWSTR pszShortcut)
{CComPtr<IPersistFile> sppf;if (FAILED(sppf.CoCreateInstance(CLSID_ShellLink))) return;if (FAILED(sppf->Load(pszShortcut, STGM_READWRITE))) return;CComQIPtr<IShellLinkDataList> spdl(sppf);if (!spdl) return;DWORD dwFlags;if (FAILED(spdl->GetFlags(&dwFlags))) return;dwFlags |= SLDF_RUNAS_USER;if (FAILED(spdl->SetFlags(dwFlags))) return;if (FAILED(sppf->Save(NULL, TRUE))) return;wprintf(L"Succeeded\n");
}
int __cdecl wmain(int argc, wchar_t *argv[])
{if (argc == 2 && SUCCEEDED(CoInitialize(NULL))) {MarkShortcutRunAs(argv[1]);CoUninitialize();}return 0;
}
这个程序本身并没有太多内容。 它创建了一个外壳链接对象(CLSID_ShellLink
), 并要求它从命令行给出的文件路径加载。 然后,它使用IShellLinkDataList::GetFlags
和IShellLinkDataList::SetFlags
来获取旧标志,并设置包括SLDF_RUNAS_USER
的新标志。 一旦完成,它将结果保存回去。
最难的部分是首先知道SLDF_RUNAS_USER
标志的存在。
我担心大多数人会读到这篇文章并说,“太棒了!我的程序需要提升权限,这就是我如何标记我的开始菜单快捷方式来提示提升权限。谢谢,Raymond!” 这些人将完全忽略了开头的段落,该段落解释了那样做是《错误的事情》。