问题标签 [createprocessasuser]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1422 浏览

createprocessasuser - CreateProcessAsUser 在我的实验中无法正常工作

我正在尝试执行以下操作: 1. 我在我的 XP 中使用运行 VS.NET 2005 的 SP2 机器以管理员帐户登录 2. 这台机器还有另一个帐户 user1,它是一个访客帐户 3. 我正在运行一个程序管理员,我想从这个程序中启动一个 notepad.exe 进程,它将在 user1 安全上下文 4 下运行。我特别想用它CreateProcessasUser来执行此操作..

这是代码剪辑器,它将解释我一直在尝试的内容..

出于某种原因,这不起作用..该DuplicateTokenEx函数返回为 1305 的错误代码,我似乎无法弄清楚为什么..

而不是DuplicateTokenEx我也使用了DuplicateToken,现在CreateProcessAsUser返回错误代码 1308。

有人可以说明一下这个问题吗..这似乎是一件显然非常简单的事情,但就是做错了.. [请注意,我特别想LogonUser然后再DuplicateToken然后CreateProcessAsUSer]

0 投票
3 回答
39012 浏览

c# - 从 C# 调用 CreateProcessAsUser

我一直在尝试使用CreateProcessAsUserWindows API 的功能在特定用户的上下文中创建一个新进程,但似乎遇到了一个相当讨厌的安全问题......

在我进一步解释之前,这是我当前用于启动新进程的代码(控制台进程 - 具体来说是 PowerShell,尽管它不重要)。

为了这里的问题,忽略处理环境变量的代码(我已经独立测试了该部分,它似乎工作。)

现在,我得到的错误如下(在调用之后的行中抛出CreateProcessAsUSer):

“客户端未持有所需的权限”(错误代码 1314)

(错误消息是通过从 Win32Exception 构造函数中删除 message 参数发现的。诚然,我这里的错误处理代码可能不是最好的,但这有点无关紧要。但是,如果您愿意,欢迎您对此发表评论。 ) 对于这种情况下这种模糊错误的原因,我真的很困惑。MSDN 文档和各种论坛帖子只给了我这么多建议,尤其是考虑到此类错误的原因似乎多种多样,我不知道我需要修改哪段代码。也许这只是我需要更改的一个参数,但我可能会做出错误/不足的 WinAPI 调用,就我所知。让我非常困惑的是,以前版本的代码使用了普通的CreateProcess函数(除用户令牌参数外等效)工作得非常好。据我了解,只需要调用 Logon 用户函数来接收适当的令牌句柄,然后复制它,以便它可以传递给CreateProcessAsUser.

非常欢迎对代码修改和解释提出任何建议。

笔记

我主要指的是 MSDN 文档(以及用于 C# 函数/strut/enum 声明的PInvoke.net )。特别是以下页面似乎在备注部分中有很多信息,其中一些可能很重要并且我无法理解:

编辑

我刚刚尝试了 Mitch 的建议,但不幸的是,旧的错误刚刚被一个新的错误所取代:“系统找不到指定的文件。” (错误代码 2)

之前的调用CreateProcessAsUser已替换为以下内容:

请注意,正如 MSDN 文档所暗示的那样,此代码不再使用重复的令牌,而是使用原始令牌。

这是使用CreateProcessWithLogonW. 这次的错误是“登录失败:未知用户名或密码错误”(错误代码1326)

我还尝试以 UPN 格式(“Alex@Alex-PC”)指定用户名并将域作为第二个参数独立传递,但都无济于事(相同的错误)。

0 投票
1 回答
7026 浏览

windows-services - 如何获取 CreateProcessAsUser 的有效用户令牌?

我有一个以普通用户身份运行的应用程序和一个作为本地系统运行的服务。我希望应用程序能够告诉服务再次启动应用程序,一旦服务完成了其他一些事情。(所以应用程序不会在服务执行它的“事情”时运行。)为了让服务能够以第一次启动它的用户身份启动应用程序,它需要一个用户令牌。应用程序在退出之前将令牌发送到服务,但在服务尝试使用它时令牌/句柄无效。(它用它做的第一件事是 DuplicateTokenEx 获取主令牌。)

用户令牌是否始终只在调用 OpenProcessToken 的进程中有效?

有没有其他方法可以做到这一点?我不希望用户必须使用 logonuser “登录”到应用程序。那将是愚蠢的。我想我可以将“explorer.exe”的进程句柄从应用程序移交给服务,服务可以使用它来获取用户令牌,但这需要 PROCESS DUP HANDLE 访问权限。我对那个解决方案并不感到兴奋,但也许这是这样做的方法?

0 投票
0 回答
2273 浏览

c++ - 从服务加载用户配置文件

在服务中,我尝试使用以下代码启动程序:

不幸的是,调用LoadUserProfile失败的GetLastError=5 (access denied). 在 userenv.log 中,我可以找到:

当然,我检查了我的服务(以 SYSTEM 身份运行)是否启用了SE_RESTORE_NAME(和SE_BACKUP_NAME)权限。

任何帮助将不胜感激 !

0 投票
4 回答
38616 浏览

createprocessasuser - CreateProcessAsUser 错误 1314

我想在另一个用户下创建一个进程。所以我使用 LogonUser 和 CreateProcessAsUser。但我的问题是,CreatePtocessAsUser 总是返回错误代码 1314,这意味着“客户端不持有所需的权限”。所以我的问题是,我做错了什么?或者我怎样才能赋予手柄特权?(我认为句柄应该有特权,还是我错了?)对不起我的英语错误,但我的英语知识不是最好的:)

如果有人知道如何更正我的申请,请提供帮助。

这是我的代码的一部分。

提前致谢!

0 投票
1 回答
3579 浏览

windows-server-2008 - 从 windows-2008-server 中的服务在非零会话中创建进程?

我想知道服务是否有一种简单的方法可以在用户会话中创建进程?

我的服务作为用户(管理员)帐户而不是作为 LocalSystem 帐户运行,因此我无法使用 WTSQueryUserToken 功能。

我试过打电话

但是当我使用这个令牌运行时

我的进程仍在会话 0 中运行。我该如何解决这个问题?

我正在使用 Ole 自动化,所以我并不关心进程将在哪个会话上运行,只要它不是会话 0 - 因为出于某种原因 Ole 不会创建它的进程(winword.exe 用于instance) 在会话 0 中,而是在其他用户会话中创建它们。

任何建议都将受到欢迎。提前致谢。

0 投票
1 回答
1460 浏览

oracle - 模拟进程不会使用 Windows 身份验证登录到 Oracle

我在 IIS7 上运行一个 asp .net web 服务。后者在 Windows 2008 R2 服务器上运行。IIS7/web 服务配置为 asp .net 模拟。工作进程所有者设置为 NETWORK SERVICE。

Web 服务调用在服务器上用他/她的域帐户模拟的 sqlplus.exe。我可以通过任务管理器看到这一点。但是,当启动 sqlplus 时,oracle 说用户名/密码错误。

sqlplus.exe 是这样启动的: sqlplu.exe / . 如果我使用用户帐户手动登录服务器并输入上面的语句,这很好用,一切都很好

0 投票
2 回答
18149 浏览

winapi - 从非交互式服务 (win32/.net/powershell) 启动 UAC 提升进程

我正在使用第三方 Windows 服务,该服务通过使用 CreateProcessAsUser() 运行脚本和可执行文件来处理一些自动化任务。由于 UAC 以及通过 API 处理 LUA 提升的方式,我在 Windows Server 2008 上遇到了问题。

该服务作为 LocalSystem 运行,并且没有启用“与桌面交互”。这些进程作为管理员组中的用户运行,但不是管理员帐户(不受许多 UAC 限制)。所有 UAC 的默认设置都已到位。

我可以将任意命令或 powershell 代码传递给服务,但我似乎无法“突破”由服务启动的非提升、非交互式进程。

问题的症结似乎是启动提升进程的唯一(公共)API 选项是带有“runas”动词的 ShellExecute(),但据我所知,不能从非交互式调用服务,否则您会收到诸如“此操作需要交互式窗口站”之类的错误。

我发现的唯一解决方法在这里提到: http ://www.eggheadcafe.com/software/aspnet/29620442/how-to-proper-use-sendinp.aspx

在 Vista 中,官方记录的提升进程的方法是仅使用 shell API ShellExecute(Ex)(不是 CreateProcess 或 CreateProcessAsUser)。所以你的应用程序必须调用 ShellExecute(Ex) 来启动一个提升到调用 SendInput 的助手。此外,由于 Session 0 隔离,服务只能使用 CreateProcessAsUser 或 CreateProcessWithLogonW(不能使用 ShellExecute(Ex))来指定交互式桌面。

..我认为没有直接的方法可以从 Windows 服务中生成提升的进程。我们只能首先使用 CreateProcessAsUser 或 CreateProcessWithLogonW 在用户会话(交互式桌面)中生成一个非提升的进程。然后在非提升的进程中,它可以使用 ShellExecute(Ex) 为实际任务生成提升的进程。

要从 .net/powershell 代码执行此操作,看起来我必须做一些复杂的 P/Invoke 操作才能调用 CreateProcessAsUser 或 CreateProcessWithLogonW,因为 .Net System.Diagnostics.ProcessStartInfo 没有我可以使用的 lpDesktop 等价物设置为“winsta0\default”。而且我不清楚 LocalSystem 是否甚至有权调用 CreateProcessAsUser 或 CreateProcessWithLogonW。

我还查看了 http://blogs.msdn.com/alejacma/archive/2007/12/20/how-to-call-createprocesswithlogonw-createprocessasuser-in-net.aspxProcess.Start 与 UAC 不同的凭据

基于所有这些,我得出的结论是,没有直接的方法可以做到这一点。我错过了什么吗?这似乎真的不应该那么难。感觉就像 UAC 从未设计用于处理非交互式用例。

如果有任何 Microsoft 人员最终阅读了这篇文章,我注意到 ShellExecute 在内部处理提升的方式是调用应用程序信息服务 (AIS)。为什么不能通过某些 Win32 或 .NET API 对 AIS 进行相同的调用? http://msdn.microsoft.com/en-us/library/bb756945.aspx

抱歉,运行时间有点长。感谢您的任何想法。

0 投票
3 回答
11457 浏览

opengl - Windows 2008 RenderFarm 服务:CreateProcessAsUser“会话 0 隔离”和 OpenGL

我有一个旧的 Windows 服务器服务和(衍生)应用程序,在 XP-64 和 W2K3 中运行良好,但在 W2K8 上失败。我相信这是因为新的“会话 0 隔离”功能。

因此,我正在寻找代码示例/安全设置 mojo,它可以让您从 Windows 服务为 Windows 2008 Server 创建一个新进程,以便我可以恢复(并可能超越)以前的行为。我需要一个解决方案:

  1. 在非零会话中创建新进程以绕过会话 0 隔离限制(无法从会话 0 访问图形硬件) - 官方的 MS 行是:

因为会话 0 不再是用户会话,所以在会话 0 中运行的服务无权访问视频驱动程序。这意味着服务渲染图形的任何尝试都会失败。在会话 0 中查询显示分辨率和颜色深度会报告系统的正确结果,最大分辨率为 1920x1200,每像素 32 位。

  1. 新进程获得可用于创建 windows DC 的 windows 站/桌面(例如 winsta0/default)。我在这里找到了一个解决方案(在交互式会话中启动 OK):Start an Interactive Client Process in C++

  2. Windows DC,当用作OpenGL DescribePixelFormat 枚举的基础时,能够找到并使用硬件加速格式(在适当配备 OpenGL 硬件的系统上)。请注意,我们当前的解决方案在 XP-64 和 W2K3 上运行良好,除非终端服务会话正在运行(VNC 工作正常。)一个也允许进程工作的解决方案(即即使在终端服务会话打开时也使用 OpenGL 硬件加速运行)将是狂热的,尽管不是必需的。

我目前被困在第 1 项上,尽管有一些类似的帖子讨论了这个问题(比如thisthis - 它们不是合适的解决方案,因为不能保证用户会话已经登录以“获取”一个会话 id 来自,我也不是从 LocalSystem 帐户运行(我是从服务的域帐户运行,我可以在合理的范围内调整其权限,尽管我宁愿不必升级优先级以包括SeTcbPrivileges。)

例如 - 这是一个我认为应该可以工作的存根,但在 SetTokenInformation 调用上总是返回错误 1314(即使 AdjustTokenPrivileges 没有返回错误)我也使用了一些涉及“LogonUser”的替代策略(而不是打开现有的进程令牌),但我似乎无法换出会话 ID。

我也怀疑在所有情况下都使用 WTSActiveConsoleSessionId(例如,如果没有交互式用户登录) - 尽管在没有登录会话的情况下运行服务的快速测试似乎返回了合理的会话值 (1)。

为了便于阅读,我删除了错误处理(仍然有点混乱 - 道歉)

在调用 SetTokenInformation 之前,所有调试输出看起来都很好——我看到会话 0 是我当前的进程会话,就我而言,它正在尝试设置会话 1(WTSGetActiveConsoleSessionId 的结果)。(请注意,我是通过 VNC 而不是 RDC 登录到 W2K8 框的)

所以 - 一个问题:

  1. 这种方法是否有效,还是所有服务启动的进程都被有意限制在会话 0 中?
  2. 有没有更好的方法(缺少“登录时启动”和服务器自动登录?)
  3. 这段代码是否有问题,或者创建进程令牌的不同方式,我可以换出会话 ID 以指示我想在新会话中生成进程?我确实尝试使用 LogonUser 而不是 OpenProcessToken,但这也不起作用。(我不在乎所有生成的进程是否共享相同的非零会话。)

非常感谢任何帮助 - 谢谢!

0 投票
1 回答
2789 浏览

c# - CreateProcessAsUser 不绘制 GUI

我有一个在“SYSTEM”帐户下运行的 Windows 服务,用于检查每个登录用户是否正在运行特定的应用程序。如果应用程序没有运行,服务将启动它(在相应的用户名下)。
我正在尝试使用 CreateProcessAsUser() 来实现我的目标。该服务确实以相应的用户名启动应用程序,但未绘制 GUI。(是的,我确保启用了“允许服务与桌面交互”复选框)。

系统:XP SP3,语言:C#

以下是一些可能感兴趣的代码:

据我了解,设置 startInfo.lpDesktop = "winsta0\default"; 应该使用相应用户的桌面。
甚至与这里所说的相反:http: //support.microsoft.com/kb/165194,我尝试将 lpDesktop 设置为 null,或者根本不设置它,两者都给出相同的结果:进程以预期的名义启动用户和我可以看到窗口标题栏的一部分。“不可见”窗口拦截鼠标点击事件,按预期处理它们。它只是不画自己。

有没有人熟悉这样的问题并且知道我做错了什么?