- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用第三方 Windows 服务,该服务通过使用 CreateProcessAsUser() 运行脚本和可执行文件来处理一些自动化任务。由于 UAC 以及通过 API 处理 LUA 提升的方式,我在 Windows Server 2008 上遇到了问题。
该服务作为 LocalSystem 运行,并且没有启用“与桌面交互”。这些进程作为管理员组中的用户运行,但不是管理员帐户(不受许多 UAC 限制)。所有 UAC 的默认设置都已到位。
我可以将任意命令或 powershell 代码传递给服务,但我似乎无法“突破”由服务启动的非提升、非交互式进程。
问题的症结似乎是启动提升进程的唯一(公共(public))API 选项是带有“runas”动词的 ShellExecute(),但据我所知,不能从非交互式调用服务,否则您会收到诸如“此操作需要交互式窗口站”之类的错误。
这里提到了我发现的唯一解决方法:
http://www.eggheadcafe.com/software/aspnet/29620442/how-to-proper-use-sendinp.aspx
In Vista, the official documented way to elevate a process is only using the shell API ShellExecute(Ex)(not CreateProcess or CreateProcessAsUser). So your application must call ShellExecute(Ex) to launch a helper elevated to call SendInput. Furthermore, due to Session 0 isolation, a service can only use CreateProcessAsUser or CreateProcessWithLogonW(can not use ShellExecute(Ex)) to specify the interactive desktop.
..I think there is no direct way to spawn an elevated process from a windows service. We can only first use CreateProcessAsUser or CreateProcessWithLogonW to spawn a non-elevated process into the user session(interactive desktop). Then in the non-elevated process, it may use ShellExecute(Ex) to spawn an elevated process for the real task.
最佳答案
打破 session 零隔离的“官方”方法是使用终端服务 API 和 CreateProcessAsUser()
的组合。在用户 session 中启动进程。在我以前的工作中,我们就是这样做的,因为我们需要在安装下载的更新之前从服务向用户显示一个对话框所以,我知道它至少在 WinXP、Win2K3、Vista 和 Win7 上有效,但我不要指望 Win 2K8 会有太大的不同。基本上,过程如下:
WTSGetActiveConsoleSessionId()
获取事件控制台 session ID(非常重要,因为交互式 session 是 而不是 始终是 session 1,即使在客户端系统上也是如此)。此 API 还将返回 -1 如果没有事件用户登录到交互式 session (即本地登录到物理机,而不是使用 RDP)。 WTSQueryUserToken()
获取代表用户登录控制台的开放 token 。 DuplicateTokenEx()
将模拟 token (来自 WTSQueryUserToken
)转换为主 token 。 CreateEnvironmentBlock()
为流程创建一个新环境(可选,但如果不这样做,流程将没有环境)。 CreateProccessAsUser()
的调用,以及可执行文件的命令行。如果您从第 4 步创建了环境 block ,则必须传递 CREATE_UNICODE_ENVIRONMENT
标志以及(总是)。这可能看起来很愚蠢,但如果你不这样做,API 会严重失败(使用 ERROR_INVALID_PARAMTER
)。 DestroyEnvironmentBlock
,否则会产生内存泄漏。该进程在启动时会获得环境 block 的单独副本,因此您只是在破坏本地数据。 AdjustTokenPrivileges()
恢复提升的(完整) token ,但也不要引用我的话。但是,如 MSDN 文档中所述,请注意,无法在尚未拥有权限的 token 上“添加”权限(例如,您无法使用
AdjustTokenPrivileges
将受限用户 token 转换为管理员;底层用户必须是管理员才能开始)。
WTSGetActiveConsoleSessionId()
和
WTSQueryUserToken()
API(与
WTSEnumerateProcesses()
一起用于 Win2K Pro)。您可以将 0 硬编码为 session ID(因为在 Win2K 中总是如此),我想您可能能够通过枚举正在运行的进程并复制其中一个 token 来获取用户 token (它应该是具有交互式 SID 存在)。无论如何,
CreateProcessAsUser()
即使您没有从服务设置中选择“与桌面交互”,在传递交互式用户 token 时也会以相同的方式运行。无论如何,它也比直接从服务启动更安全,因为该进程不会继承神圣的
LocalSystem
访问 token 。
关于winapi - 从非交互式服务 (win32/.net/powershell) 启动 UAC 提升进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2426594/
在本教程中,您将通过示例学习 JavaScript。 JavaScript 中的提升是一种在声明之前可以使用函数或变量的行为。例如, // using test before declarin
我正在学习javascript提升功能,发现下面的代码真的很困惑: var a = 1; function b() { a = 10; return; function a()
作为一个JS学习者,我发现了一件很有趣的事情,考虑下面的代码。 this.init = function (e) { var container = e.container;
Quasiquotes 的 Scala 文档在解释 Lifting 时提到了这一点: One can also combine lifting and unquote splicing: scala
我是新来的。到目前为止,我一直在使用 MVC 模型并使用基本的 session 管理模型,即在 session 中存储一个 token 并检查每个请求。 我正在尝试对lift做同样的事情,但我的 se
我当前使用的是Elasticsearch 2.4版,希望根据查询时间的增加或加权,根据我称为“类型”的字段对结果集进行微调。 例如 如果字段“类型”的值为“船”,则将权重或增强值增加4 如果字段“类型
一年多以来,我一直在大量使用 lift、return 以及 EitherT、ReaderT< 等构造函数,等等。我读过《Real World Haskell》、《Learn You a Haskell
我浏览了电梯的MegaProtoUser遇到这种结构:??("Last Name")。谁能解释一下,这是什么意思? 谢谢解答 最佳答案 它是在对象 S 上定义的: def ??(str : Strin
我有一个Solr索引,每个文档都是一个Event的信息。在我的架构中,Schedule 是日期类型的多值字段。我想知道是否可以使用计划日期来增加文档(多值字段中的任何日期)在未来并且最接近当前日期?我
作为测试,我正在尝试使用设计人员友好的模板在 lift 中创建一个表单。我正在使用 Lift 2.5 我已经设法使用 toForm 创建了一个工作表单,但我只是在探索所有可能的方法。 我的 html
如果这个问题已经被问到,我深表歉意。 是否可以清除已经设置的条件变量? 下面是我想要实现的详细信息: void worker_thread { while (wait_for_conditio
尝试学习Js,无法理解为什么DOM元素没有获取到值: var Car = function(loc) { var obj = Object.create(Car.prototype); obj
我想知道吊装。我知道如果全局函数名称与全局变量相同,函数会覆盖变量的名称。是吗? 这是我的代码。 (function() { console.log('console.log#1 ' + glob
这个问题已经有答案了: var functionName = function() {} vs function functionName() {} (41 个回答) 已关闭 7 年前。 在javas
我正在开发 Windows 资源管理器 namespace 扩展。我的应用程序是explorer.exe在某个时候加载和使用的动态库。我需要我的 DLL 在 C:\中创建文件,有时在其他需要提升才能执
背景: GitHub 属于客户。我们团队中有一些新手,他们有时会错过基本的命名约定和其他编码协议(protocol)。所以,如果哪位前辈想在内部review,除了创建PR,别无他法。但是这个 PR 对
我们需要在运行时更改 HKEY_LOCAL_MACHINE 的一些设置。 如果需要在运行时,是否可以提示 uac 提升,或者我是否必须启动第二个提升的进程来完成“肮脏的工作”? 最佳答案 我会以提升的
看着Haskell文档,提升似乎基本上是 fmap 的概括,允许映射具有多个参数的函数。 Wikipedia然而,关于提升的文章给出了不同的观点,根据类别中的态射来定义“提升”,以及它如何与类别中的其
ggplot2 package 很容易成为我用过的最好的绘图系统,除了对于较大的数据集(约 50k 点)性能不是很好。我正在研究通过 Shiny 提供网络分析,使用 ggplot2作为绘图后端,但我对
是否可以提升 powershell 脚本的权限,以便没有管理员权限的用户可以运行该脚本?我们的网络管理员正在尝试寻找更省时的方法来完成某些任务,目前他们必须使用远程桌面...使用 PS 脚本将其自动化
我是一名优秀的程序员,十分优秀!