【问题标题】:c# service: how to get user profile folder pathc#服务:如何获取用户配置文件文件夹路径
【发布时间】:2016-11-10 04:27:05
【问题描述】:

我需要从 C# Windows 服务中获取用户目录...
...如 C:\Users\myusername\
理想情况下,我希望有漫游路径...
...如 C:\Users\myusername\AppData\Roaming\
当我在控制台程序中使用以下内容时,我得到了正确的用户目录......

System.Environment.GetEnvironmentVariable("USERPROFILE"); 

...但是当我在服务中使用相同的变量时,我得到...
C:\WINDOWS\system32\config\systemprofile
如何从服务中获取用户文件夹甚至漫游文件夹位置?
提前致谢。

【问题讨论】:

  • Windows 服务未以登录用户身份运行。如果您对您正在尝试做的事情进行更多解释,这可能有助于回答。

标签: c# path windows-services profile


【解决方案1】:

我已搜索从 Windows 服务获取用户的配置文件路径。我发现了这个问题,其中不包括解决方法。由于我找到了解决方案,部分基于 Xavier J 对其回答的评论,因此我决定将其发布在这里以供其他人使用。

以下是执行此操作的一段代码。我已经在几个系统上对其进行了测试,它应该可以在从 Windows XP 到 Windows 10 1903 的不同操作系统上运行。


    //You can either provide User name or SID
    public string GetUserProfilePath(string userName, string userSID = null)
    {
        try
        {
            if (userSID == null)
            {
                userSID = GetUserSID(userName);
            }

            var keyPath = @"SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\" + userSID;

            var key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(keyPath);
            if (key == null)
            {
                //handle error
                return null;
            }

            var profilePath = key.GetValue("ProfileImagePath") as string;

            return profilePath;
        }
        catch
        {
            //handle exception
            return null;
        }
    }

    public string GetUserSID(string userName)
    {
        try
        {
            NTAccount f = new NTAccount(userName);
            SecurityIdentifier s = (SecurityIdentifier)f.Translate(typeof(SecurityIdentifier));
            return s.ToString();
        }
        catch
        {
            return null;
        }
    }

【讨论】:

    【解决方案2】:

    首先,您需要使用Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)

    Environment.SpecialFolder.ApplicationData 用于漫游配置文件。

    在此处查找所有 SpecialFolder 枚举值:https://msdn.microsoft.com/en-us/library/system.environment.specialfolder(v=vs.110).aspx

    正如其他人所指出的,服务将在帐户 LocalSystem/LocalService/NetworkService 下运行,具体取决于配置:https://msdn.microsoft.com/en-us/library/windows/desktop/ms686005(v=vs.85).aspx

    【讨论】:

    • 我从 Environment.SpecialFolder.ApplicationData 得到 C:\WINDOWS\system32\config\systemprofile\AppData\Roaming 这不是我想要的。我想我必须在注册表中查找由 codenoir 替代的内容
    【解决方案3】:

    服务不会像用户一样登录,除非该服务被配置为使用特定用户的配置文件。所以它不会指向“用户”文件夹。

    【讨论】:

    • 这是有道理的。是否有一个变量包含用户配置文件文件夹的保存位置?那我就一一列举吧。
    • 此节点下的注册表项。 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList。查找“ProfilesDirectory”条目
    • 有没有办法知道哪个用户当前登录了?
    • System.Environment.UserName
    • 我尝试了 System.Environment.GetEnvironmentVariable("UserName") 它给了我计算机名而不是用户名。我真的需要用户名,所以我可以将它等同于 C:\Users 目录中的文件夹
    猜你喜欢
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    相关资源
    最近更新 更多