【问题标题】:Is it possible for a Windows service impersonate a user without a password?Windows 服务是否可以在没有密码的情况下模拟用户?
【发布时间】:2012-01-08 10:00:38
【问题描述】:

作为本地系统或本地服务运行的 C# Windows 服务是否可以模拟另一个用户不需要该用户的密码?

如何做到这一点?

注意:我这样做的动机是能够在服务中运行用户特定的 WMI 查询。我正在进行的 WMI 调用(对 OfflineFiles WMI API)是用户敏感的,并且它们仅在我作为我想要查询其数据的用户运行我的服务时才起作用。我不希望用户在安装服务时必须输入他们的用户名和密码,所以我想将服务作为本地系统或其他方式运行,并冒充我关心的用户。

【问题讨论】:

  • 我怀疑,如果您在模拟用户后解释您希望该服务做什么,那么您的运气会更好。 AFAIK,如果没有存储凭据(这意味着用户在某个时候输入密码),您所要求的内容是不可能的
  • @ChrisShain,我已按照您的建议更新了问题。
  • 查看这个问题的答案:stackoverflow.com/questions/559719/…

标签: c# .net windows-services


【解决方案1】:

假设您只需要在相关用户登录时开始模拟,您可以:

  1. 使用 EnumProcesses 定位相关的用户会话(例如 http://msdn.microsoft.com/en-us/library/windows/desktop/ms682623(v=vs.85).aspx)[winapi]
  2. 相关用户进程 [winapi] 上的 OpenProcessToken()
  3. 具有模拟权限的 DuplicateToken() [winapi]
  4. 使用 DuplicateToken 的结果创建一个新的 WindowsIdentity()
  5. 呼叫。从第 4 步开始模拟您的新身份

一旦令牌被复制,用户是否登录都没有关系 - 您的服务中的模拟仍然存在。

显然,未记录的ZwCreateToken winapi函数的API虽然也可以实现这一点,但我从未使用过它,将来可能会随时中断。

【讨论】:

【解决方案2】:

据我所知,出于明显的安全原因,无法执行此操作。您必须有密码才能调用 LogonUser,然后调用 WindowsIdentity.Impersonate。

一个例外:如果您通过远程调用将现有 WindowsIdentity 传递给服务,那么您可以在服务中模拟该 WindowsIdentity,但应用程序不能以这种方式运行。

【讨论】:

  • 安全原因并不明显 - 如果您是在本地系统帐户上运行的服务,那么您确实无能为力。
猜你喜欢
  • 1970-01-01
  • 2017-09-07
  • 2016-04-10
  • 2013-08-21
  • 2011-10-18
  • 2017-06-25
  • 2018-01-19
  • 1970-01-01
相关资源
最近更新 更多