2011-11-29 32 views
6

作为本地系统或本地服务运行的C#Windows服务是否可能假冒其他用户而不需要该用户的密码Windows服务可能在没有密码的情况下冒充用户吗?

这将如何完成?

注意:我的动机是能够在服务中运行用户特定的WMI查询。我所做的WMI调用(对于OfflineFiles WMI API)是用户敏感的,并且只有当我将我的服务作为其数据要查询的用户运行时才能工作。我不希望用户在安装服务时输入他们的用户名和密码,所以我想仅以本地系统或其他方式运行该服务,并模拟我关心的用户。

+0

我怀疑你将有更好的运气,如果你要解释你的服务做一旦它模拟的用户是什么。据我所知,你问的也不是没有可能积攒凭证(这意味着在某些时候输入密码的用户) –

+0

@ChrisShain,如你所说我已经更新的问题。 – Eric

+0

检查出这个问题的答案:http://stackoverflow.com/questions/559719/windows-impersonation-from-c-sharp –

回答

7

假设你而相关用户登录时只需要启动模拟,你可以:

  1. 使用EnumProcesses找到相关用户会话(例如http://msdn.microsoft.com/en-us/library/windows/desktop/ms682623(v=vs.85).aspx)[WINAPI]
  2. OpenProcessToken()上的相关用户进程[WINAPI]
  3. DuplicateToken()与模拟特权[WINAPI]
  4. 创建使用DuplicateToken
  5. 校准的结果的新的WindowsIdentity() l。从第4步开始的新身份登录

一旦令牌被复制,用户是否登录 - 服务中的模拟仍然存在并不重要。

显然,API无证ZwCreateToken WINAPI功能虽然也能达到这一点,但我从来没有使用它,并在任何时候在将来可能会断裂。

+0

for#1,也可以使用'Process.GetProcesses()' –

+0

事实上,有一种使用S4U(服务用户)的技术: https://blogs.msdn.microsoft.com/winsdk/2015/08/28 /以用户身份登录不需要密码/ https://msdn.microsoft.com/en-us/library/windows/desktop/aa378128(v=vs.85).aspx –

-1

Topshelf窗口服务API/Tool支持它并且是开源的。 [更新]我错过了你至少需要密码进行一次性配置。

+0

哪里该说它能模仿没有他们的密码的用户? – BlackICE

+0

TS文档中的哪些地方介绍了该功能?我非常希望看到他们的实施。 –

+0

@David,当然你需要密码。 – kenny

0

据我所知,由于明显的安全原因无法完成。您必须拥有密码才能调用LogonUser,然后调用WindowsIdentity.Impersonate。

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

+1

安全原因并不明显 - 如果您是使用本地系统帐户运行的服务,那么您确实无法做到这一点。 – EFraim

相关问题