【问题标题】:How do I get the home directory of an *arbitrary* (i.e. not the current) user in PHP under Windows?如何在 Windows 下的 PHP 中获取 *arbitrary*(即不是当前)用户的主目录?
【发布时间】:2014-08-23 02:17:27
【问题描述】:

有没有办法在Windows下获取用户名指定的用户的主目录?

我知道如何获取 当前 用户的主目录(通过 HOMEDRIVE、HOMEPATH 和 HOMESHARE 环境变量)。但是,当您只知道用户名时,对于任意用户呢?

也就是说,Windows下的~username之类的等价物是什么?

【问题讨论】:

  • 总是这样 :/Users/?
  • @VladimirHraban 不幸的是,它是完全可配置的。用户主目录不一定位于同一个文件夹、同一个驱动器,甚至是同一个物理机器中。
  • 我这里没有 Windows 机器,但也许注册表节点 HKEY_Users\ \Environment\Tmp 会有所帮助。有一些方法可以使用 php & Wscript 读取/写入注册表
  • @VladimirHraban:用户注册表配置单元仅在相应用户登录时才会加载。
  • 在 Windows 下并没有真正接近 ~username 的功能。甚至 HOMEDRIVE/HOMEPATH/HOMESHARE 中的信息也不一致;它可能指向本地配置文件夹或网络主目录,两者几乎没有共同之处。所以你真的需要知道你实际上在哪个文件夹。然而不幸的是,无论您想要哪个文件夹,答案都可能是“没有办法做到这一点”。 (一个例外:如果您知道用户有一个网络主目录,则此信息可从域中获得。)

标签: php windows shell


【解决方案1】:

我认为唯一可能的答案是“不能做”,原因如下:

  • ~username 具有在 Windows 中根本不存在的语义含义;没有单一的“主”目录,而是用于特定目的的各种不同目录。其中许多可以由系统管理员或最终用户重新定位,并且可能需要在非英语配置中进行本地化。

    (特别注意,即使在与当前用户打交道时,也很少有将文件放在用户的配置文件目录或相对于该目录的任何固定路径中的情况。例如,某些应用程序写信给<userprofile>\Documents<userprofile>\AppData,如果有问题的文件夹具有本地化名称或已被重定向或重新定位,则会导致行为不端。)

  • 即使在最简单的情况下,如果没有用户的安全令牌,也无法查找用户配置文件或任何用户文件夹的位置,您需要用户密码或现有的在用户上下文中运行的进程。 (这是一个善意的谎言:实际上,如果您拥有管理员权限,则 可以伪造令牌,但付出的努力将是不成比例的,而且在这种情况下,伪造的令牌能否可靠地工作还不清楚无论如何。)

  • 如果该文件夹在网络上,即使您能找到它,您也可能无法访问它。

在特定情况下,可能会有一些可行的方法,例如创建您自己的目录树或要求每个帐户都配置一个旧的(“网络用户”或 NT 域样式)主目录。对于通用库,这可能不是一个好主意,但如果您认为值得,您可以提供一个函数允许程序员显式打开此行为(例如,可能使用可配置的目录根目录)。

关于您关于引发异常的评论:请记住,在 Windows 中,~ 是一个合法字符,可能出现在实际文件名或相对路径的开头。因此,根据上下文,最好不要赋予它任何特殊含义。

【讨论】:

  • 我认为您对大部分内容都是正确的。我认为环境变量HOMEDRIVEHOMEPATH 构成了在大多数*nix 环境下语义上等同于~ 的单个“主”目录。但这显然只适用于当前用户。感谢您的回答!
  • 如果配置了旧版主目录(由“net user”显示),则HOMEDRIVEHOMEPATH 指向它。这样的目录通常指向一个网络文件夹(尽管它可以是本地的),用户希望在其中存储文件,即,它与用户的 Documents 文件夹具有大致相同的含义。如果 Documents 文件夹由组策略重定向,则它可能与旧主目录位于同一位置。
  • 相反,如果旧版主目录配置,HOMEDRIVEHOMEPATH 指向的不是用户的 Documents 文件夹,而是他们的配置文件文件夹,其中(如已经讨论过)几乎从来都不是有用的信息。所以总结一下,我之所以不认为这个等价于Linux~是因为结果不一致,在更常见的场景下用处不大。 (不幸的是,默认情况下不指向用户的 Documents 文件夹。那样会更有用。)
  • 我看到最常见的用例是按用户存储配置文件(ala ~/.ssh)。只要目录通常可由当前用户写入,并且对于每个用户保持一致,就足以达到此目的。
  • 这不是太不合理,尽管我个人觉得当软件将配置文件放在我的主目录中时很烦人。这适用于 my 文件;配置文件应该放在 Application Data 文件夹中。诚然,MS 软件有一个讨厌的习惯,即在您的主目录中创建文件夹而不询问......这也很烦人。 :-) (请确保避免将大文件放在用户的配置文件目录中,因为如果配置了漫游配置文件,所有这些文件都会在登录和注销时通过网络复制。)
猜你喜欢
  • 2012-03-21
  • 2023-03-03
  • 1970-01-01
  • 2010-11-11
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
相关资源
最近更新 更多