【问题标题】:Vista: create a process from service with out popping up any dialog boxesVista:从服务创建进程而不弹出任何对话框
【发布时间】:2010-02-17 10:46:37
【问题描述】:

我是 vista 新手,不是高级程序员。从过去几天开始,我正在尝试消化有关 vista 的许多技术细节。但我仍然有一些基本的问题。希望大家能帮我解答我的问题。

我们可以从在本地系统帐户下运行的服务创建一个交互式进程(其中包含一个带有“invokeAsAdministrator”的嵌入式清单文件)吗?

在这里,我知道会话 0 隔离和所有内容。我仍然在问这个问题,因为当我通过 CreateProcessAsUser(需要管理员权限)创建交互式进程时,它失败并出现错误 740。使用它时,我已经给出了正确的会话 ID。会话 ID 是我的活动桌面的 ID,我的用户以管理权限登录。

如果可以创建进程,是否会显示 UAC 对话框?

如果出现 UAC 对话框,我们可以避免这种情况吗?

【问题讨论】:

  • 想为问题添加更多细节。如果我有一个在会话 1 中运行的管理员令牌,并且如果我在本地系统帐户中运行的服务中使用该令牌来 CreateProcessAsUser;这是否不能创建需要管理员权限的进程(通过在清单文件中请求)?

标签: windows-vista visual-c++


【解决方案1】:

这是一个很好理解的问题。本地帐户没有管理员权限。你唯一能做的就是模仿。您临时模拟另一个帐户(在您的情况下是管理员)。您可以在 MSDN 中找到主题 WindowsIdentity.Impersonate (http://msdn.microsoft.com/en-us/library/chf6fbt4.aspx) 的此技术示例

编辑

抱歉,发帖后才发现你用的是vc++, 在 Win API 上使用 ImpersonateLoggedOnUser

【讨论】:

  • 所以从服务创建进程,我需要计算机的用户名、密码和域名。我想没有这些输入就无法创建流程,即使登录的用户是管理员。如果我错了,请纠正我。
  • @coolcake - 是的,你是对的。但是您有 2 个选项:(1)创建属于管理员的假用户,但通过删除大多数权限来限制它们,然后模仿它。 (2) 不是从 LOCAL 启动您的服务,而是从这个假用户帐户启动您的服务 - 例如 IIS 从 IIS_XXXX 用户启动 webservice 的方式完全相同。
  • 您好,Dewfy,非常感谢您的及时回复。我可以从代码中创建假用户吗?我目前正在将旧代码移植到 Vista,其中早期的 exe 是从服务启动的。对不起,如果我问你一些基本问题。
  • @coolcake 当然可以,但请注意 - 创建用户 LOCAL SYSTEM 帐户是不够的!如果您打算在“安装”时执行此操作,那么我建议您查看 WMI(只需几秒钟即可在谷歌上搜索这篇文章:eggheadcafe.com/forumarchives/scriptingVisualBasicscript/…
  • 你好 Dewfy,在发布这个问题之前我得到了什么令牌,那只是我的管理员帐户。我已经使用 api GetUserName() 确认了这一点。在此之后,我使用该令牌调用了 ImpersonateLoggedOnUser,模拟调用成功但 CreateProcessAsUser 仍然失败并出现错误 740。请帮助。
【解决方案2】:

在我的情况下,createprocessasuser 失败,因为默认情况下,当我们查询用户桌面会话的用户令牌时,我得到了一个为用户创建的受限令牌(对于管理员,创建了两个令牌 1)受限令牌 2)完整的令牌;我的应用程序只能由管理员运行)。

通过浏览网络,我发现我必须找到链接令牌并使用该令牌来创建进程。

从服务创建进程的代码可以在以下问题中找到: Desktop problem with using CreateProcessAsUser from a service on Vista

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 2017-03-11
    相关资源
    最近更新 更多