翻译《The Old New Thing》- How do I mark a shortcut file as requiring elevation?

How do I mark a shortcut file as requiring elevation? - The Old New Thing (microsoft.com)icon-default.png?t=N7T8https://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::GetFlagsIShellLinkDataList::SetFlags来获取旧标志,并设置包括SLDF_RUNAS_USER的新标志。 一旦完成,它将结果保存回去。

        最难的部分是首先知道SLDF_RUNAS_USER标志的存在。

我担心大多数人会读到这篇文章并说,“太棒了!我的程序需要提升权限,这就是我如何标记我的开始菜单快捷方式来提示提升权限。谢谢,Raymond!” 这些人将完全忽略了开头的段落,该段落解释了那样做是《错误的事情》。

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0x0007

可不可奖励我吃只毛嘴鸡 馋😋

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值