用Python服务映射网络驱动器
(还有其他类似的问题,但没有真正的答案,更别提涉及Python的答案了……)
我有一个在Windows XP SP3上运行的服务,它是用Python写的,需要能够为所有用户挂载一个网络驱动器。我尝试使用net use
配合subprocess
(甚至还用了net.exe的完整路径),但因为这个服务是以SYSTEM用户身份运行的,所以net
对我很不满意(它抱怨没有用户上下文)。可能有办法通过WMI来实现,但我还没搞明白怎么做。
编辑:其实,也许你不能用WMI来做到这一点。这篇文章似乎表明这个功能在WSH中可用,但在WMI中不可用。也许还是有办法用net
或map
来实现呢?
1 个回答
呃……很遗憾,简单来说就是不行。如果你的Python程序作为Windows服务在运行,这里会有很多复杂的问题……让我来解释一下。
首先,要让服务程序能够访问网络,它必须在一个有网络访问权限的用户账户下运行。SYSTEM账户是不能用的(因为它禁止所有网络访问),但你可以使用“NETWORK SERVICE”账户(在域环境中,这实际上是机器的域账户),或者其他实际的用户账户。
不过,你不能在服务账户中映射驱动器,因为它不会加载用户配置文件,这个配置文件里包含了“映射”到驱动器字母的能力。(技术上讲,如果服务运行一个CMD批处理文件,这个脚本可以映射一个驱动器字母并使用它,但这样做在下次登录时就不会保留……不过这不重要。)相反,程序想要在网络上获取的任何东西都应该通过UNC路径来访问(比如 \SERVERNAME\SHARENAME)。
最后,驱动器映射不能“对所有用户有效”——映射的驱动器是每个用户配置文件独有的(即使它使用相同的字母指向同一个服务器共享)。如果有多个用户同时登录到一台机器上(例如,在终端服务器上,或者一个用户和一个以另一个用户账户运行的服务),他们不能共享映射的驱动器——每个人都必须有自己的。
不过,你可以这样做:创建一个登录脚本(或者组策略等),将预期的驱动器字母(比如说“M:”)映射到服务器共享(\server\share)。如果这个脚本在每个用户登录时都运行,他们就都会有相同的映射。然后,当你的程序作为服务需要访问那个共享时,它就必须使用UNC路径(当然,还需要一个有适当权限的用户账户)。
希望这能帮到你!