如何从更高级别启动用户级别的 Exe

2024-05-26

我希望一个进程始终在用户级别运行。当它由以管理员级别运行的安装程序(自定义,而不是 msi)启动时,或者当用户登录时。环顾四周,我不确定这是否可能。


最简单的方法是有 2 个进程。一种是普通用户,它启动提升/管理进程。然后管理进程可以使用 IPC 来要求普通用户进程做一些事情。

如果你没有正常的用户进程,那么陈雷蒙德 http://blogs.msdn.com/b/oldnewthing/archive/2013/11/18/10468726.aspx文件:

从未提升的流程到提升的流程很容易。您可以通过以下方式运行具有高程的进程传递 runas 动词 http://blogs.msdn.com/b/vistacompatteam/archive/2006/09/25/771232.aspx到 ShellExecute 或 ShellExecuteEx。

走另一条路就更棘手了。一方面,很难通过修改你的令牌来正确地消除海拔特性。另一方面,即使您可以做到这一点,但这也不是正确的做法,因为未提升的用户可能与提升的用户不同。

这里的解决方案是返回资源管理器并要求资源管理器为您启动该程序。由于 Explorer 以原始未提升用户身份运行,因此程序(在本例中为 Web 浏览器)将以 Bob 身份运行。如果您要打开的文件的处理程序作为进程内扩展而不是作为单独的进程运行,这一点也很重要,因为在这种情况下,尝试取消提升将是毫无意义的,因为在第一名。 (如果文件的处理程序尝试与自身的现有未提升副本进行通信,则可能会因为 UIPI 的原因而失败。)

好吧,我知道小程序不应该有动力,但我就是控制不住自己。废话够多了。我们来写代码吧。 (请记住,小程序很少或根本不进行错误检查,因为这就是它们的运行方式。)

#define STRICT
#include <windows.h>
#include <shldisp.h>
#include <shlobj.h>
#include <exdisp.h>
#include <atlbase.h>
#include <stdlib.h>

void FindDesktopFolderView(REFIID riid, void **ppv)
{
 CComPtr<IShellWindows> spShellWindows;
 spShellWindows.CoCreateInstance(CLSID_ShellWindows);

 CComVariant vtLoc(CSIDL_DESKTOP);
 CComVariant vtEmpty;
 long lhwnd;
 CComPtr<IDispatch> spdisp;
 spShellWindows->FindWindowSW(
     &vtLoc, &vtEmpty,
     SWC_DESKTOP, &lhwnd, SWFO_NEEDDISPATCH, &spdisp);

 CComPtr<IShellBrowser> spBrowser;
 CComQIPtr<IServiceProvider>(spdisp)->
     QueryService(SID_STopLevelBrowser,
                  IID_PPV_ARGS(&spBrowser));

 CComPtr<IShellView> spView;
 spBrowser->QueryActiveShellView(&spView);

 spView->QueryInterface(riid, ppv);
}    

void GetDesktopAutomationObject(REFIID riid, void **ppv)
{
 CComPtr<IShellView> spsv;
 FindDesktopFolderView(IID_PPV_ARGS(&spsv));
 CComPtr<IDispatch> spdispView;
 spsv->GetItemObject(SVGIO_BACKGROUND, IID_PPV_ARGS(&spdispView));
 spdispView->QueryInterface(riid, ppv);
}

GetDesktopAutomationObject 函数定位桌面文件夹视图,然后请求该视图的调度对象。然后,我们以调用者请求的形式返回该调度对象。这个调度对象是一个 ShellFolderView,它的 C++ 接口是 IShellFolderViewDual,所以大多数调用者都会要求该接口,但如果你是一个受虐狂,你可以跳过双重接口并直接与 IDispatch 对话。

void ShellExecuteFromExplorer(
    PCWSTR pszFile,
    PCWSTR pszParameters = nullptr,
    PCWSTR pszDirectory  = nullptr,
    PCWSTR pszOperation  = nullptr,
    int nShowCmd         = SW_SHOWNORMAL)
{
 CComPtr<IShellFolderViewDual> spFolderView;
 GetDesktopAutomationObject(IID_PPV_ARGS(&spFolderView));
 CComPtr<IDispatch> spdispShell;
 spFolderView->get_Application(&spdispShell);

 CComQIPtr<IShellDispatch2>(spdispShell)
    ->ShellExecute(CComBSTR(pszFile),
                   CComVariant(pszParameters ? pszParameters : L""),
                   CComVariant(pszDirectory ? pszDirectory : L""),
                   CComVariant(pszOperation ? pszOperation : L""),
                   CComVariant(nShowCmd));
}

ShellExecuteFromExplorer 函数首先获取桌面文件夹自动化对象。我们使用桌面并不是因为它特别有意义,而是因为我们知道它永远存在。

与桌面文件夹视图一样,我们对 ShellFolderView 对象本身并不感兴趣。这对我们来说很有趣,因为该对象驻留在托管桌面视图的进程(这是主 Explorer 进程)中。从 ShellFolderView 中,我们请求 Application 属性,以便可以访问主 Shell.Application 对象,该对象具有 IShellDispatch 接口(及其扩展 IShellDispatch2 到 IShellDispatch6)作为其 C++ 接口。我们真正想要的是 IShellDispatch2::ShellExecute 方法。

我们使用适当的参数调用 IShellDispatch2::ShellExecute。请注意,IShellDispatch2::ShellExecute 的参数与 ShellExecute 的参数顺序不同!

好吧,让我们把它放在一个小程序中。

int __cdecl wmain(int argc, wchar_t **argv)
{
 if (argc < 2) return 0;

 CCoInitialize init;
 ShellExecuteFromExplorer(
    argv[1],
    argc >= 3 ? argv[2] : L"",
    argc >= 4 ? argv[3] : L"",
    argc >= 5 ? argv[4] : L"",
    argc >= 6 ? _wtoi(argv[5]) : SW_SHOWNORMAL);

 return 0;
}

该程序采用强制命令行参数,该参数是要执行的内容,无论是程序、文档还是 URL。可选参数是正在执行的事物的参数、要使用的当前目录、要执行的操作以及如何打开窗口。

打开提升的命令提示符,然后以各种方式运行该程序。

  • scratch http://www.msn.com/ http://www.msn.com/
    在用户的默认 Web 浏览器中打开未提升的网页。
  • 暂存 cmd.exe "" C:\Users "" 3
    在 C:\Users 处打开未提升的命令提示符,并将其最大化。
  • 从头开始 C:\Path\To\Image.bmp "" "" 编辑
    在未提升的图像编辑器中编辑位图。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从更高级别启动用户级别的 Exe 的相关文章

  • 如何使用 C# 中的参数将用户重定向到 paypal

    如果我有像下面这样的简单表格 我可以用它来将用户重定向到 PayPal 以完成付款
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • SetCurrentDirectoryW 中的错误 206

    在我之后之前不清楚的问题 https stackoverflow com questions 44389617 long path name in setcurrentdirectoryw 我以某种方式能够创建一个具有长路径名的目录 但是
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 重载<<的返回值

    include
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • SVG SMIL animateTransform 缓动

    我正在尝试向简单的 SVG SMIL 动画添加计时功能 显然 计时 缓动可以通过以下方式设置keySplines属性 但是在我的示例中它不起作用
  • aerospike 连接超时工作不正常?

    我正在使用 aerospike java 客户端 v 6 0 1 并使用客户端读取策略中的以下配置 clientPolicy readPolicyDefault connectTimeout 1000 clientPolicy readPo
  • jQuery - 禁用选定的选项

    需要使用 jQuery 禁用选择框中已选择的选项 我希望它变灰 就像汇编选择 http www ryancramer com projects asmselect examples example1 html 测试我的例子here http
  • md5 哈希冲突。

    如果从 1 数到 X 其中 X 是第一个与前一个数字发生 md5 冲突的数字 那么 X 是哪个数字 我想知道如果我使用 md5 作为序列号 在发生冲突之前我可以期望能够枚举多少个单元 Theoretically you can expect
  • Yii 2.0 AJAX 请求的 CSRF 验证

    我有一个ajax触发从我的数据库中删除条目的函数 我需要去做CSRF验证相同 我怎样才能做到这一点 我正在发送CSRF cookie连同我的帖子请求 但是Yii 2 0不验证它 并且通过 ajax 传递的任何输入都会到达服务器 我该怎么做C
  • 如何在 Angular 5 中添加规范链接

    如何在 Angular 5 中动态添加规范链接 面对同样的问题 我四处搜索并找到了有关如何执行此操作的指南 https www concretepage com angular angular title service and canon
  • 如何获取另一个应用程序的版本名称

    我想获取 Minecraft Pocket Edition 的版本名称 示例 0 13 0 b5 这是MCPE 我的世界袖珍版 的包 com mojang minecraftpe 我想要版本为String 我怎样才能做到这一点 我的获取包名
  • Sqoop 导出分区的 Hive 表

    我在尝试导出分区的 Hive 表时遇到了一些问题 这是否完全受支持 我尝试用谷歌搜索并找到一张 JIRA 票证 sqoop export connect jdbc mysql localhost testdb table sales exp
  • Lucene 4.4.0新增ControlledRealTimeReopenThread示例使用

    在新的 Lucene 4 4 0 版本中 近实时管理器 org apache lucene search NRTManage 已被替换为受控实时重开线程 https issues apache org jira browse LUCENE
  • 在 C# 中转换 VbScript 函数(Right、Len、IsNumeric、CInt)

    同样 我在 VbScript 中得到了以下代码 您能建议一下 C 中的等效代码吗 Function GetNavID Title getNavID UCase Left Title InStr Title 1 End Function 我已
  • Laravel Blade:@extends('adminlte::page') 中参数中的双列是什么意思

    我想使用这个管理面板 https github com jeroennoten Laravel AdminLTE https github com jeroennoten Laravel AdminLTE 但我不明白这个语法 extends
  • 即使使用 return 语句,带有 forEach 的函数也返回未定义

    我只是创建一个函数来检查对象数组中某些内容的值 但由于某种原因它不断返回undefined 这是为什么 Demo http jsfiddle net cNYwz 1 http jsfiddle net cNYwz 1 var data Ke
  • WPF - 普通 [标签:输入] 控制的最佳实践

    我想知道 这是在 WPF 中获取众所周知的标签输入 或输出 无关紧要 组合的最佳和最快的方法 这是一个简单的任务 只需考虑 对象 ME 的快速输出 名字 克里斯蒂安 年龄 28 心情 好 我知道 我可以使用带有文本块的网格 但说实话 这个
  • 如何将多个值存储到一个键(java)

    我搜索一个可以存储多个键值对的数据结构 数据基本上是这样的 1 value 1 2 value 2 于是我想到了使用HashMap 遗憾的是 这对我不起作用 因为一个键可能会出现多个值 在上面的例子中 1 value 2 可能是另一个条目
  • 如何在 Azure DevOps 发布管道中保存测试结果

    在发布管道期间 我将启动 Selenium 测试 如果这些测试失败 则会进行屏幕截图 我正在寻找一种上传它们的方法 以便我可以查看它们并检查出了什么问题 我设法将它们压缩 但不幸的是 所有上传方法都不适用于发布管道 有没有办法在发布管道期间
  • 如何从网上获取源代码?

    我正在尝试从 Web 获取 HTML 源代码 我尝试这样做 u new URL url URLConnection con u openConnection con setRequestProperty User Agent Mozilla
  • 如何在Retrofit(Android)中动态设置标题

    我使用的 API 使用授权方案 需要设置特殊的 X Authorization 标头来验证请求 例如 此 Retrofit 设置非常适合其身份验证令牌为abc123 Headers X Authorization abc123 GET po
  • 连接到 JIRA 时 Bitbucket 问题部分无用?

    我已将 Bitbucket 存储库与 JIRA 项目连接起来 现在 当我提交到 Bitbucket 时 我可以引用 JIRA 问题 或者可以在 JIRA 的 Bitbucket 存储库中创建分支并查看 JIRA 的提交 但是 当我在 JIR
  • Java SSO 与 Wildfly 8、Java 1.8.0_45 和 Active Directory

    我对这个主题进行了很多搜索 但找不到解决方案 要求的简短描述 Wildfly 8 2 下 Web 应用程序上的 SSO 在 Active Directory 中验证 Windows 用户的身份 当 SSO 失败时回退到登录表单 在 Wild
  • 如何从更高级别启动用户级别的 Exe

    我希望一个进程始终在用户级别运行 当它由以管理员级别运行的安装程序 自定义 而不是 msi 启动时 或者当用户登录时 环顾四周 我不确定这是否可能 最简单的方法是有 2 个进程 一种是普通用户 它启动提升 管理进程 然后管理进程可以使用 I