C#应用程序(所有用户安装)应为每个用户使用%appdata%(即使是runAs Admin和/或RDP会话中)

问题描述 投票:2回答:1

我正在为所有用户安装C#应用程序。

个人计算机上的每个用户都可以使用该程序,我需要为每个用户存储特定于用户的数据。

我从Enviroment.SpecialFolder.ApplicationData开始给我C:\Users\USER\AppData\Roaming。但是,当用户选择以管理员身份运行并输入管理员凭据时,这将不起作用,它将给我:C:\Users\ADMIN\AppData\Roaming

所以我开始使用WMI呼叫:

ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT UserName FROM Win32_ComputerSystem");
ManagementObjectCollection collection = searcher.Get();    

string username_with_domain = (string)collection.Cast<ManagementBaseObject> ().First().ToString();

并通过用户名获取文件夹。

但是:这在远程桌面会话(RDP / MSTSC)中不起作用-它返回“”,所以我必须回退到Enviroment.UserName

摘要

  • 用户启动.exe:Works。 (ENVIROMENT.UserName)
  • 用户与“ ADMIN”用户一起使用“以管理员身份运行”:Works。 (WMI呼叫)
  • 用户在RDP会话中启动.exe:Works。 (回退到(ENVIROMENT.UserName))
  • 用户在具有“ ADMIN”用户的“以管理员身份运行”的RDP会话中启动.exe:不起作用

问题:如何获取当前登录用户的AppData文件夹或用户名?例如谁拥有我看到的台式机?

c# windows user-management appdata
1个回答
0
投票

虽然没有直接关系,但此处出现有关您的问题的精彩讨论:Run a process from a windows service as the current user

您面临的主要问题是可能有多个用户登录到同一桌面(https://www.codeproject.com/Articles/13822/Get-Information-About-the-Currently-Logged-on-Us-2)。如果是这样,您选择哪个用户?

如上述SO链接所建议,您有两个可行的选择:

  1. 与捕获当前信息的应用程序一起安装服务用户(而不是后台和存储中的“运行身份”用户)启动的应用程序可以在存储库中存储的信息访问。
  2. 使用Windows API-上面的链接进入详细信息。

新想法:

根据您的反馈(在评论中),我有另一种看法可能对您有用。 Windows事件日志在Windows Logs -> Security事件查看器分支下记录了事件ID 4624成功的桌面登录。该事件包含一个时间戳记值。在我看来,如果您按事件ID 4624过滤这些事件日志条目,并获取指示该域中用户的安全ID的最新条目(您可以根据需要决定确切的过滤方式),则应该能够根据您的帖子要求确定“拥有桌面”用户的用户ID。我不认为这种方法会失败。我确实知道您可能对事件日志数据有访问问题,但是我认为这仅可能发生在非管理员安全上下文中。在这种情况下,System.Security.Principal.WindowsIdentity.GetCurrent().Name应每次为您提供非管理员用户名;如果返回的是Admin用户名,那么(并且只有那时)您是否需要深入研究“事件日志”以进行分析。您可以找到有助于您从C#探索事件日志的帖子(例如Read event viewer entries)。

© www.soinside.com 2019 - 2024. All rights reserved.