如何说服PowerShell(通过任务调度程序)找到我的网络驱动器?

时间:2010-10-29 20:36:45

标签: windows-7 powershell task scheduler

我在Windows 7上有一个简单的PowerShell脚本无法正常工作。 (这不是XP的问题)

get-psdrive

当我直接运行时,我得到了

  Name           Used (GB)     Free (GB) Provider      Root
----           ---------     --------- --------      ----
A                                      FileSystem    A:\
Alias                                  Alias
C                  12.30         11.60 FileSystem    C:\
cert                                   Certificate   \
D                                      FileSystem    D:\
Env                                    Environment
Function                               Function
HKCU                                   Registry      HKEY_CURRENT_USER
HKLM                                   Registry      HKEY_LOCAL_MACHINE
**Q                1486.63        289.41 FileSystem    Q:\**
Variable                               Variable
WSMan                                  WSMan

当我通过任务计划程序运行时,我得到了

Name           Used (GB)     Free (GB) Provider      Root
----           ---------     --------- --------      ----
A                                      FileSystem    A:\
Alias                                  Alias
C                  12.30         11.60 FileSystem    C:\
cert                                   Certificate   \
D                                      FileSystem    D:\
Env                                    Environment
Function                               Function
HKCU                                   Registry      HKEY_CURRENT_USER
HKLM                                   Registry      HKEY_LOCAL_MACHINE
Variable                               Variable
WSMan                                  WSMan

请注意,我错过了我的Q:驱动器。如果有任何方法可以解决这个问题,我将能够在那里复制文件....

3 个答案:

答案 0 :(得分:6)

网络驱动器,实际上所有驱动器号都被“映射”到给定登录会话的卷。当您创建要运行的计划任务时,它会创建新的登录会话(即使您当前已登录)并在该上下文中运行计划任务。因此,虽然您可能已登录并且已映射Q驱动器 - 运行该任务的第二个会话具有完全不同的环境,但Windows足以自动映射所有会话的C :(和其他物理驱动器)。

使用PowerShell时,您不需要将地图映射到驱动器,除了方便之外。与cmd.exe的前身不同,PowerShell非常乐意将当前目录更改为UNC样式路径:

cd \\server\share\directory

是否有可能在不绘制驱动器的情况下完成所需的操作?您已经提到了复制文件 - 如果任务是使用您的凭据运行的,并且假设您拥有Q:驱动器的权限(比如说\ server \ share),那么您的脚本应该能够执行以下操作:

copy c:\logs\*.log \\server\share\logs

无需映射驱动器即可正常工作。

这是我的测试的完整命令信息。如果您的环境不同,请注意如何。该任务配置为仅在我登录时以我的域帐户身份运行,具有最高权限并为Windows 7 / Server 2008 R2配置。

动作是启动程序:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

参数

-command copy c:\logs\*.log \\server\share\logs

答案 1 :(得分:1)

也许在脚本中运行get-psdrive之前,首先要执行以下操作:

$net = new-object -comobject Wscript.Network
$net.mapnetworkdrive("Q:","\\path\to\share",0,"domain\user","password")

完成工作后(复制文件..):

$net.removenetworkdrive("Q:")

答案 2 :(得分:0)

如果您不想在脚本中输入密码,则会遭到黑客入侵,我更希望避免这种情况:

  • 以足够的权限打开您的文件夹(例如域用户)
  • 以管理员身份打开powershell,并建立从UNC到本地路径的符号链接

    New-Item -ItemType SymbolicLink -Path“ C:\ LocalTemp \” -Value“ \ unc”

  • 您现在可以直接在powershell脚本中使用UNC路径,它将使用计划任务中提供的凭据打开它。

计划任务中的凭据可能存在一些问题,但是在我看来,这比脚本中清除或伪混淆的密码要好。