2010-07-13 185 views
0

(有沿着这些线路等问题,但他们都没有任何真正的答案,更别说答案对付蟒蛇...)映射网络驱动器

我有一个Windows服务(XP SP3)用Python编写,需要能够为所有用户安装网络驱动器。我尝试使用net usesubprocess(即使是net.exe的完整路径),但考虑到您的服务作为SYSTEM用户运行,net对您非常不满(它抱怨缺少用户上下文)。有可能通过WMI来做到这一点,但我一直无法弄清楚。

编辑:其实,也许你不能用WMI来做到这一点。 This article似乎表明此功能在WSH中可用,但不在WMI中可用。也许有些方法可以使用netmap来做到这一点?

回答

1

呃...可悲的是,简短的回答是否定的。如果Python程序是作为Windows服务运行的,这里有很多复杂的问题......所以让我解释一下。

首先,为了甚至允许服务程序本身访问网络,它必须在允许网络访问的用户帐户下运行。 SYSTEM帐户已禁用(所有网络访问均被禁止),但您可以使用“NETWORK SERVICE”帐户(在域环境中,该帐户实际上是计算机的域帐户)或其他实际用户帐户。

但是你不能在服务帐户中映射驱动器,因为它不会加载用户配置文件,包括“映射”到驱动器盘符的能力。 (从技术上讲,如果服务运行CMD批处理文件,该脚本可以映射一个驱动器盘符并使用它,但是它不会持续下一次登录......但是从来不会这样)。相反,任何程序想要通过UNC路径访问网络(如\ SERVERNAME \ SHARENAME)。

最后,无法为“所有用户”制作驱动器映射 - 映射驱动器对每个用户配置文件都是唯一的(即使它使用相同的字母指向相同的服务器共享)。如果您有多个用户登录到计算机(例如,在终端服务器上,或者用户和服务在另一个用户帐户下运行),他们无法共享映射驱动器 - 每个用户都必须拥有自己的映射驱动器。

但是,您可以这样做:制作一个登录脚本(或组策略等),将驱动器与期望的字母(比如说“M:”)映射到服务器共享(\ server \分享)。如果此脚本在登录时为每个用户运行,则它们都具有相同的映射。然后当程序运行即服务需要访问该共享时,它必须使用UNC路径(当然还有一个具有适当权限的用户帐户)。

希望有帮助!

+0

显然,系统没有完全禁止网络访问 - 我已经能够使用WNetAddConnection2进行到远程服务器的连接,并使用该连接复制文件 - 我只是不能操纵用户环境映射驱动器。 – 2010-07-13 04:16:55

+0

此外,使用登录脚本是一个很好的主意......这可能对我有用。 :-) – 2010-07-13 04:18:22

+0

令人惊讶的是,SYSTEM帐户允许一些出站连接......至少不是*应该*。非常适合Micro $ oft的安全沙箱! – ewall 2010-07-13 13:45:44