我正在为所有用户安装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
。
摘要
问题:如何获取当前登录用户的AppData文件夹或用户名?例如谁拥有我看到的台式机?
虽然没有直接关系,但此处出现有关您的问题的精彩讨论: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链接所建议,您有两个可行的选择:
根据您的反馈(在评论中),我有另一种看法可能对您有用。 Windows事件日志在Windows Logs -> Security
事件查看器分支下记录了事件ID 4624成功的桌面登录。该事件包含一个时间戳记值。在我看来,如果您按事件ID 4624过滤这些事件日志条目,并获取指示该域中用户的安全ID的最新条目(您可以根据需要决定确切的过滤方式),则应该能够根据您的帖子要求确定“拥有桌面”用户的用户ID。我不认为这种方法会失败。我确实知道您可能对事件日志数据有访问问题,但是我认为这仅可能发生在非管理员安全上下文中。在这种情况下,System.Security.Principal.WindowsIdentity.GetCurrent().Name
应每次为您提供非管理员用户名;如果返回的是Admin用户名,那么(并且只有那时)您是否需要深入研究“事件日志”以进行分析。您可以找到有助于您从C#探索事件日志的帖子(例如Read event viewer entries)。