使用Windows服务获取用户访问权限?

时间:2015-12-08 10:11:25

标签: winapi windows-services

我有一个服务应用程序。在此服务中,我想在注册表中为我的用户访问存储在CURRENT_USER部分下的值。在我看来,解决这个问题的方法是将服务与当前用户帐户相关联,我了解该服务默认情况下使用SYSTEM用户访问权限运行。

我在Windows服务管理器中找到了“服务属性”下的服务登录标签,因此我非常确定某个地方的API可以满足我的需求。如何在代码中将服务与我的用户相关联?

2 个答案:

答案 0 :(得分:0)

您对自己需要做的事情的分析与多用户系统的实际情况完全不一致。

考虑机器有两个常规用户A和B的情况。用户A在早上使用机器,然后注销。用户B在午餐后登录并在当天余下的时间内使用机器。设置服务的登录详细信息时,必须为该服务指定单个用户。但是你选择哪个用户A或B?

情况变得更糟。上面的方案一次只有一个用户登录。但是,多个用户完全可以同时登录到计算机。你想要哪一个?大概是活跃的。但是,如果机器正在运行终端服务并且多个用户同时处于活动状态会怎样呢?

忽略终端服务问题,只考虑第一种情况,您可以执行以下操作:

  1. 找到活动会话,找到与该会话关联的用户。
  2. 找到该用户的SID。
  3. System.out.println(vehicleString.getCapacity()); //output: Seriously! System.out.println(vehicleInteger.getCapacity()); //output: 3 System.out.println(vehicleDouble.getCapacity()); //output: 2.2
  4. 中读取该SID的相应配置单元

    然而,我想知道这是否真的是你希望做的。我的猜测是,无论您遇到什么问题,都可以更好地解决您的问题。但我不想在不知道问题是什么的情况下推测出更好的解决方案。

    最后,HKEY_USERS帐户是计算机上最强大的帐户。出于安全原因,建议您不要在该帐户下运行您的服务,除非有充分的理由这样做。你真的需要使用这个账户吗?

答案 1 :(得分:0)

好的,首先,我建议在Windows服务编程上阅读MSDN上的一些文章。 Solomon& Russinovich是一个好的开始。

首先 - 服务应该是“无人看管”。如果您希望服务无论如何与用户进行交互,有以下几种方法:

  • 在特定用户凭据下运行服务
  • 创建runnable-by-user UI

方法有利有弊。在特定用户凭据下运行意味着一些管理工作。在某些情况下它可能很容易,在一些公司的新东西中它可能会太痛苦。 用户应用程序是另一种方式想想任何,比如你在图标托盘中拥有的数据库管理控制台。而已。数据库作为服务运行,您有用户应用程序。这是一项额外的工作,但另一方面,您可以更好地分离服务功能和对此功能的实际控制,可能是多用户环境中的每个用户。