我如何得到一个*任意*(即不是当前)用户在Windows下的PHP的主目录


How do I get the home directory of an *arbitrary* (i.e. not the current) user in PHP under Windows?

是否有办法在Windows下的PHP中获得由用户名指定的用户的主目录?

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

换句话说,Windows下的~username等于什么?

我认为唯一可能的答案是"no can do",原因如下:

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

    (特别要注意,即使在处理当前用户时,也很少有将文件放在用户的概要文件目录或相对于该目录的任何固定路径中是明智的。例如,一些应用程序写入<userprofile>'Documents<userprofile>'AppData,如果有问题的文件夹有本地化名称或已被重定向或重新定位,则会导致错误行为。

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

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

在特定情况下,可能有一些方法是有意义的,例如创建您自己的目录树或要求每个帐户配置一个遗留("net用户"或NT域风格)主目录。对于泛型库,这可能不是一个好主意,尽管如果您认为值得这样做,您可以提供一个函数,允许程序员显式地打开此行为(例如,可能使用可配置的目录根)。

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