Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows服务是否可以模拟没有密码的用户?_C#_.net_Windows Services - Fatal编程技术网

C# Windows服务是否可以模拟没有密码的用户?

C# Windows服务是否可以模拟没有密码的用户?,c#,.net,windows-services,C#,.net,Windows Services,作为本地系统或本地服务运行的C#Windows服务是否可以模拟另一个用户而不需要该用户的密码 如何做到这一点 注意:我这样做的动机是能够在服务中运行用户特定的WMI查询。我正在进行的WMI调用(对OfflineFiles WMI API)是用户敏感的,只有当我以要查询其数据的用户身份运行服务时,这些调用才起作用。我不希望用户在安装该服务时必须输入用户名和密码,因此我只希望以本地系统或其他方式运行该服务,并模拟我关心的用户。据我所知,出于明显的安全原因,这是无法做到的。您必须拥有密码才能调用Log

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

如何做到这一点


注意:我这样做的动机是能够在服务中运行用户特定的WMI查询。我正在进行的WMI调用(对OfflineFiles WMI API)是用户敏感的,只有当我以要查询其数据的用户身份运行服务时,这些调用才起作用。我不希望用户在安装该服务时必须输入用户名和密码,因此我只希望以本地系统或其他方式运行该服务,并模拟我关心的用户。

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


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

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

  • 使用EnumProcess(例如)[winapi]定位相关的用户会话
  • 相关用户进程[winapi]上的OpenProcessToken()
  • 具有模拟权限的DuplicateToken()[winapi]
  • 使用DuplicateToken的结果创建新的WindowsIdentity()
  • 呼叫。在步骤4中模拟您的新身份
  • 一旦复制了令牌,用户是否仍保留服务中的模拟日志就无关紧要了


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

    如果您解释一下该服务在模拟用户后要执行的操作,我想您的运气会更好。好了,如果不保存凭据(这意味着用户在某个时候输入密码),你所要求的是不可能的@ChrisShain,我已经按照你的建议更新了这个问题。查看这个问题的答案:安全原因并不明显-如果你是一个在本地系统帐户上运行的服务,那么你真的什么都做不了。对于#1,也可以使用
    Process.getprocesss()
    确实有一种使用S4U(用户服务)的技术: