代码之家  ›  专栏  ›  技术社区  ›  Nick Bastin

使用python服务映射网络驱动器

  •  0
  • Nick Bastin  · 技术社区  · 15 年前

    (这几行还有其他问题,但没有一个真正的答案,更不用说与python打交道的答案了…)

    我有一个用python编写的Windows服务(xp sp3),它需要能够为所有用户安装网络驱动器。我试着用 net use 具有 subprocess (即使有到net.exe的完整路径),但是考虑到您的服务作为系统用户运行, net 对您非常不满意(它抱怨缺乏用户上下文)。可能有一种方法可以通过wmi来实现这一点,但我还没有弄清楚。

    编辑 :实际上,也许你不能用wmi来做这个。 This article 似乎表明此功能在wsh中可用,但在wmi中不可用。也许是某种方法 map 到底要这么做?

    1 回复  |  直到 15 年前
        1
  •  1
  •   ewall    15 年前

    呃。。。遗憾的是,简短的答案是否定的。如果python程序作为Windows服务运行,这里会有多种复杂的情况…所以让我解释一下。

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

    但是,您将无法在服务帐户中映射驱动器,因为它没有加载用户配置文件,其中包含将驱动器号“映射”到驱动器号的功能。(从技术上讲,如果服务运行的是一个cmd批处理文件,那么该脚本可以映射一个驱动器号并使用它,但是在下一次登录时它将不会持久化……但是不要忘记。)相反,程序想要进入网络的任何东西都应该通过UNC路径(如\servername\sharename)访问。

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

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

    希望有帮助!