【问题标题】:Get user root directory from windows service从windows服务获取用户根目录
【发布时间】:2018-11-09 09:20:42
【问题描述】:

我有一个用 C# 编写的 Windows 服务。我需要向每个用户目录添加一个文件。如何找到开始的路径?我意识到这真的很愚蠢,但这就是我目前正在做的事情:

  if (Directory.Exists("C:\\Users"))
  {
    path = "C:\\Users";
  }
  else if (Directory.Exists("C:\\Documents and Settings"))
  {
    path = "C:\\Documents and Settings";
  }

我查看了特殊文件夹:http://msdn.microsoft.com/en-us/library/system.environment.specialfolder.aspx

他们似乎都没有返回我需要的东西。例如,ApplicationData 返回 System32 目录的路径。我认为这是因为它作为 Windows 服务运行。我目前使用的代码适用于我完成的少数测试。似乎应该有一种更智能(防错)的方式来获取这条路径。

另一个想法...也许有一个注册表项可以给我我正在寻找的东西?嗯

【问题讨论】:

  • 我想知道用户怎么可能也存在于其他目录中。
  • 是的,我知道这是可能的......这就是为什么我正在寻找更好的解决方案。
  • 否;我的意思是让用户存在于多个目录中。
  • 你不应该使用像上面这样的硬编码路径,因为它们在操作系统版本上不一致。虽然较新版本的 Windows 确实通过对旧文件夹名称进行软/硬链接来支持向后兼容性,但不能保证总是如此
  • @Tseng:这正是他问这个问题的原因。

标签: c# .net windows


【解决方案1】:

我在 Win7 注册表下找到了这个。 XP 看起来具有相同的注册表项,但其中的值包含“所有用户”配置文件。

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders]
"Common Desktop"="C:\\Users\\Public\\Desktop"
"Common Start Menu"="C:\\ProgramData\\Microsoft\\Windows\\Start Menu"
"CommonVideo"="C:\\Users\\Public\\Videos"
"CommonPictures"="C:\\Users\\Public\\Pictures"
"Common Programs"="C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs"
"CommonMusic"="C:\\Users\\Public\\Music"
"Common Administrative Tools"="C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Administrative Tools"
"Common Startup"="C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Startup"
"Common Documents"="C:\\Users\\Public\\Documents"
"OEM Links"="C:\\ProgramData\\OEM Links"
"Common Templates"="C:\\ProgramData\\Microsoft\\Windows\\Templates"
"Common AppData"="C:\\ProgramData"

【讨论】:

  • 服务不在用户的上下文中运行,那么这个环境变量怎么会存在呢?
  • 服务是否在系统下运行?
【解决方案2】:

我可能没有完全理解你,但我认为你只需要获取你正在运行的位置,然后将 Root 移除。

Path.GetPathRoot(Assembly.GetEntryAssembly().Location);

更新

special folders 是您需要研究的内容。因为你的问题不够详细,所以没有一个简单的去这里做。如果服务作为特定用户或系统运行,那么会有所不同。此外,您没有指定它是如何使用的,所以这很重要。它是保存配置文件的地方还是写入文件的临时位置与其他人是否应该进入该文件夹?所有这些事情都很重要,所以如果你添加一些额外的细节,那么我会更新我的答案。

【讨论】:

  • 我相信他正在尝试访问所有配置文件用户,但由于他在系统帐户下运行,他不知道如何检索它。
【解决方案3】:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList 和密钥 ProfilesDirectory 怎么样?它指向我电脑上的%SystemDrive%\Users。只是不确定哪些版本的 Windows 有这个密钥(7 和 10 有)。

【讨论】:

    猜你喜欢
    • 2012-05-09
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多