使用 Windows 服务的凭据启动进程

2023-12-05

我有一个以 mydomain\userA 身份运行的 Windows 服务。我希望能够从服务运行任意 .exe。通常,我使用 Process.Start() 并且它工作正常,但在某些情况下我想以不同的用户(mydomain\userB)运行可执行文件。

如果我更改用于启动进程的 ProcessStartInfo 以包含凭据,我就会开始收到错误 - 要么出现错误对话框,显示“应用程序无法正确初始化 (0xc0000142)。单击“确定”终止应用程序。”,要么出现错误消息“访问被拒绝”Win32Exception。如果我从命令行运行进程启动代码而不是在服务中运行它,则进程将使用正确的凭据启动(我已通过将 ProcessStartInfo 设置为运行 whoami.exe 并捕获命令行输出来验证这一点)。

我还尝试过使用 WindowsIdentity.Impersonate() 进行模拟,但这并没有起作用 - 据我了解,模拟仅影响当前线程,并且启动新进程会继承进程的安全描述符,而不是当前线程。

我在一个隔离的测试域中运行它,因此 userA 和 userB 都是域管理员,并且都具有域范围内的“作为服务登录”权限。


当您使用 ProcessStartInfo 启动新进程时,该进程将在与启动进程相同的窗口站和桌面中启动。如果您使用不同的凭据,那么用户通常没有足够的权限在该桌面上运行。当 user32.dll 尝试在新进程中初始化但无法初始化时,会导致初始化失败错误。

要解决此问题,您必须首先检索与窗口站和桌面关联的安全描述符,并为您的用户向 DACL 添加适当的权限,然后在新凭据下启动您的进程。

编辑:关于如何执行此操作的详细描述和示例代码在这里有点长,所以我整理了一个article与代码。

        //The following security adjustments are necessary to give the new 
        //process sufficient permission to run in the service's window station
        //and desktop. This uses classes from the AsproLock library also from 
        //Asprosys.
        IntPtr hWinSta = GetProcessWindowStation();
        WindowStationSecurity ws = new WindowStationSecurity(hWinSta,
          System.Security.AccessControl.AccessControlSections.Access);
        ws.AddAccessRule(new WindowStationAccessRule("LaunchProcessUser",
            WindowStationRights.AllAccess, System.Security.AccessControl.AccessControlType.Allow));
        ws.AcceptChanges();

        IntPtr hDesk = GetThreadDesktop(GetCurrentThreadId());
        DesktopSecurity ds = new DesktopSecurity(hDesk,
            System.Security.AccessControl.AccessControlSections.Access);
        ds.AddAccessRule(new DesktopAccessRule("LaunchProcessUser",
            DesktopRights.AllAccess, System.Security.AccessControl.AccessControlType.Allow));
        ds.AcceptChanges();

        EventLog.WriteEntry("Launching application.", EventLogEntryType.Information);

        using (Process process = Process.Start(psi))
        {
        }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Windows 服务的凭据启动进程 的相关文章

  • 关于逻辑/算法的想法以及如何防止线程写入 Sql Server 中的竞争

    我有以下逻辑 public void InQueueTable DataTable Table int incomingRows Table Rows Count if incomingRows gt RowsThreshold async
  • C# 中的 Stack<> 实现

    我最近一直在实现递归目录搜索实现 并且使用堆栈来跟踪路径元素 当我使用 string Join 连接路径元素时 我发现它们被颠倒了 当我调试该方法时 我查看了堆栈 发现堆栈内部数组中的元素本身是相反的 即最近 Push 的元素位于内部数组的
  • 在 C 语言中,为什么数组的地址等于它的值?

    在下面的代码中 指针值和指针地址与预期不同 但数组值和地址则不然 怎么会这样 Output my array 0022FF00 my array 0022FF00 pointer to array 0022FF00 pointer to a
  • 无法继承形状

    为什么我不能使用继承 a 的类Shapes class http msdn microsoft com en us library ms604615 28v vs 90 29 我需要延长Rectangle具有一些方法的类 但我想以与使用相同
  • 在 C++ 代码中转换字符串

    我正在学习 C 并开发一个项目来练习 但现在我想在代码中转换一个变量 字符串 就像这样 用户有一个包含 C 代码的文件 但我希望我的程序读取该文件并插入将其写入代码中 如下所示 include
  • 使用 C# 和 ASP.NET 在电子邮件附件中发送 SQL 报告

    我正在尝试使用 ASP NET 和 C 从 sql reportserver 2008 作为电子邮件附件发送报告 到目前为止我学会了如何获取 PDF 格式的报告 http weblogs asp net srkirkland archive
  • platformnotsupportedException :XSLCompiledTransform.Load(xslt) 未在 .net Core 2.1 目标框架中加载带有 的 xslt 文件

    我有一个 xml 文件 需要将其转换为 txt 为此我使用了 xslt 转换 我的 xslt 转换文件包含一些支持 javascript 函数 如果我在 net Framework 4 5 及更高版本中运行代码 我可以成功转换文件 但相同的
  • C# 根据当前日期传递日期时间值

    我正在尝试根据 sql server 中的两个日期获取记录 Select from table where CreatedDate between StartDate and EndDate我通过了5 12 2010 and 5 12 20
  • Libev,如何将参数传递给相关回调

    我陷入了 libev 中争论的境地 通常 libev 在类似的函数中接收包 接收回调 没关系 但是实际操作中 我们需要派遣一个亲戚 写回调 根据收到的包裹处理具体工作 例如 S RECV MSG pstRecvMsg S RECV MSG
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • 调整屏幕和字体设置的 WPF 应用程序(或者,我如何将 DLU 与 WPF 中的单元相关联?)

    在MFC中 对话框的设计使用DLUs http msdn microsoft com en us library bb847924 aspx 在 WPF 中 我们以 1 96 英寸为单位指定 虽然这确实会缩放窗口和视觉元素 但我们如何使 W
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • SQLAPI++ 的免费替代品? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何免费 也许是开源 的替代品SQLAPI http www sqlapi com 这个库看起来
  • ASP.NET Core 中间件与过滤器

    在阅读了 ASP NET Core 中间件之后 我对何时应该使用过滤器以及何时应该使用中间件感到困惑 因为它们似乎实现了相同的目标 什么时候应该使用中间件而不是过滤器 9频道有一个关于此的视频 ASP NET 怪物 91 中间件与过滤器 h
  • 当Model和ViewModel一模一样的时候怎么办?

    我想知道什么是最佳实践 我被告知要始终创建 ViewModel 并且永远不要使用核心模型类将数据传递到视图 这就说得通了 让我把事情分开 但什么是Model 和ViewModel一模一样 我应该重新创建另一个类还是只是使用它 我觉得我应该重
  • 读取依赖步行者输出

    I am having some problems using one of the Dlls in my application and I ran dependency walker on it i am not sure how to
  • 以编程方式创建 Blob 存储容器

    我有一个要求 即在创建公司时 在我的 storageaccount 中创建关联的 blob 存储容器 并将容器名称设置为传入的字符串变量 我已尝试以下操作 public void AddCompanyStorage string subDo
  • 如何编写一个接受 int 或 float 的 C 函数?

    我想用 C 语言创建一个扩展 Python 的函数 该函数可以接受 float 或 int 类型的输入 所以基本上 我想要f 5 and f 5 5 成为可接受的输入 我认为我不能使用if PyArg ParseTuple args i v
  • 在 C# 的 WebAPI 中的 ApiController 上使用“传输编码:分块”提供数据

    我需要服务分块传输使用编码数据API控制器 因为我无权访问HttpContext or the Http请求 我有点不知道在哪里写入响应以及在哪里刷新它 设置如下 public class MyController ApiControlle
  • 如何高效计算连续数的数字积?

    我正在尝试计算数字序列中每个数字的数字乘积 例如 21 22 23 98 99 将会 2 4 6 72 81 为了降低复杂性 我只会考虑 连续的数字 http simple wikipedia org wiki Consecutive in

随机推荐

  • 将 RIGHT 外连接转换为左外连接 SQLite

    我需要为 Sqlite 设计一个查询 原来的查询是这样的 FROM PhysicianActivity INNER JOIN Activity ON PhysicianActivity ActivityID Activity ID RIGH
  • 在运行时将 byte[] 加载到 System.Windows.Controls.Image 中

    我有一个代表 png 文件的 byte 我正在通过 WebClient 下载此 png 当 WebClient 下载了我通过 URL 引用的 png 时 我得到一个 byte 我的问题是 如何将 byte 加载到 WPF 中的 System
  • 调整大小后 QRubberBand 在 QGraphicsView 上移动

    我在这个主题中遇到了同样的问题 当我调整窗口大小时 QRubberBand 移动 经过几次尝试 我意识到本主题的解决方案不适用于 QGraphics 视图 当我调整窗口大小时 为什么我的选择会围绕 QgraphicsView 移动 impo
  • 如何使用seaborn displot 将直方图条形围绕刻度线居中?堆叠酒吧是必不可少的

    我搜索了许多制作以刻度线为中心的直方图的方法 但无法找到适用于 seaborn displot 的解决方案 函数 displot 允许我根据数据框中的列堆叠直方图 因此更喜欢使用 displot 的解决方案或允许基于数据框中的列进行堆叠的解
  • 遍历整个 PDF 并将蓝色更改为黑色(同时更改下划线的颜色)+ iText

    我正在使用下面的代码从 pdf 文本中删除蓝色 它运行良好 但它不是改变下划线颜色 而是正确改变文本颜色 原始文件部分 被操纵的文件 正如您在上面的操作文件中看到的 下划线颜色没有改变 两周以来我一直在寻找解决这个问题的方法 任何人都可以帮
  • Firebase 中的嵌套列表[重复]

    这个问题在这里已经有答案了 尝试了解如何在 Firebase 中实现嵌套列表 问题可简化为 一个 1 对 N 消息传递系统 其中 对于每条消息 您希望维护已接收并阅读该消息的用户列表 已读过 Firebase 中数组的最佳实践 尝试避免使用
  • 如何更改 pandas groupby.agg 函数的输入参数?

    我在使用 groupby object agg 方法和想要更改输入参数的函数时遇到问题 是否有可用的函数名称资源 agg 接受 以及如何将参数传递给它们 请参阅下面的示例 import pandas as pd import numpy a
  • Jenkins 无法访问已安装的驱动程序

    我的 Jenkins 服务器在 Windows 2008 服务器上的 Tomcat 中运行 我在CentOS上搭建了一个NFS服务器 Win2008服务器可以通过mount命令访问NFS共享文件夹 我在 Windows 上以管理员用户身份运
  • 阻止孩子覆盖父母的轮廓?

    由于某些元素位于幻灯片内 我使用带有负偏移量的轮廓而不是边框 然而 子元素覆盖了轮廓 但我想要它们上面的边框 我用它来构建内容 http jsfiddle net z22kw2zq 1 parent position relative ou
  • 有效地查找数组中元素的行列?

    如何有效地找到数组中每个元素的排名 在平局的情况下求平均值 例如 float rank T T input Implementation auto foo rank 3 6 4 2 2 foo 3 5 4 1 5 1 5 我能想到的唯一方法
  • 当应用程序处于后台或关闭状态时,无法从 Firebase 消息服务将记录插入 SQLite 数据库

    我正在尝试 Firebase 通知 我能够使用通知正常工作this文档 消息已收到 我能够从内部向通知栏发送通知MyFirebaseMessagingService服务等级 即使应用程序处于后台或关闭时也会发生这种情况 我需要的是收集通知中
  • 授权 Twitter 成功后返回应用

    我将我的应用程序配置为使用通过推特登录特征 但在 Safari 上授权应用程序成功后 我无法返回到我的应用程序 我在堆栈溢出上看到了另一个有同样问题的问题使用 URLShemes但这对我不起作用 我没有足够的声誉来添加评论来要求他们接受答案
  • 充分利用 MVC Owin 身份和 n(3) 层架构

    我一直在学习开箱即用欧文身份我喜欢它为我们提供的用户管理的易用性 然后我遇到的问题是它通过 似乎 直接与 EF 交互ApplicationDbContext这是我不想要的 我更喜欢使用我的 3 层架构 IE 它与服务层 BLL 交互 而服务
  • 区分退出和会话超时

    我有以下要求 当用户终止 bash 会话时生成审核日志 退出 当 bash 会话超时时生成审核日志 这些审核日志必须不同 我正在玩下面的脚本trap sh export TMOUT 10 function handle timeout ec
  • 为什么从给定订阅者抛出异常时永远不会调用 OnError 回调?

    请观察以下单元测试 using System using System Reactive Linq using System Threading using System Threading Tasks using Microsoft Vi
  • [NSLocale PreferredLanguages] 和 [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"] 之间有什么区别?

    有什么区别 NSLocale preferredLanguages and NSUserDefaults standardUserDefaults objectForKey AppleLanguages 我对Apple文档的描述感到困惑 无
  • 插件菜单之外的自定义菜单

    我正在开发 Google Sheets Addon 并希望在 Addon 菜单之外创建自定义菜单 如下所示 预期产出 实际产量 我发现它仅适用于容器绑定脚本 但不适用于插件 这是不可能的 根据文档 这仅适用于未发布的附加组件 但即使在测试附
  • 为什么这两个空数组的填充方式不同?

    我有这个代码 我什至放入 console logs 来调试它 但我真的不明白为什么他们的行为方式不同 为什么 result1 数组用最后一个数组值填充所有内部数组 var myMatrix 0 1 2 3 4 5 6 7 8 9 10 11
  • C++ 数组初始值设定项警告

    我已经在类中声明并初始化了一个常量 char 数组 class grid const char test 11 s e 1 2 3 4 5 6 7 8 9 我的代码可以工作 但我不断收到编译器警告 非静态数据成员初始值设定项仅适用于 C 1
  • 使用 Windows 服务的凭据启动进程

    我有一个以 mydomain userA 身份运行的 Windows 服务 我希望能够从服务运行任意 exe 通常 我使用 Process Start 并且它工作正常 但在某些情况下我想以不同的用户 mydomain userB 运行可执行