【问题标题】:How can I convince powershell (run through task scheduler) to find my network drive?如何说服 powershell(通过任务计划程序运行)找到我的网络驱动器?
【发布时间】:2011-05-02 15:01:38
【问题描述】:

我在 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: 驱动器。如果有什么办法可以解决这个问题,我可以在那里复制文件....

【问题讨论】:

  • 听起来像是权限问题 - 您确定计划任务的用户对文件系统和 powershell 都具有正确的权限吗?
  • 是的,我以“我”的身份运行,并检查了“最高权限”... :(
  • 呃...周末我一直在挖掘,发现了一个糟糕的解决方法。使用“net use h:\\server\mount /user:domain/credentials 密码”将使其工作。严重地?这就是我的全部?它可以工作,但现在我的脚本中有用户名凭据......是的,我可以使用 .net 加密,但真的......

标签: windows-7 powershell task scheduler


【解决方案1】:

如果您不想在脚本中设置密码,则有一个 hack,我希望避免这种情况:

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

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

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

计划任务中的凭据可能存在一些问题,但我认为这仍然比脚本中明文或伪混淆的密码更好。

【讨论】:

    【解决方案2】:

    也许在脚本中运行 get-psdrive 之前,首先做这样的事情:

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

    在完成你的工作(复制文件..)之后:

    $net.removenetworkdrive("Q:")
    

    【讨论】:

    • 哦,我没有发现你的评论 not-bob - 这个解决方案就像你的 net-use 一样。
    • 是的,你的答案和我的一样。即使以同一用户身份运行,我仍然很困惑为什么它的工作方式不同。叹息...但是为了使这种解决方法更加明显,我会将您的答案标记为我正在寻找的答案。谢谢!
    【解决方案3】:

    网络驱动器,实际上是所有驱动器号,都“映射”到给定登录会话的卷。当您创建要运行的计划任务时,它会创建一个新的登录会话(即使您当前已登录)并在该上下文中运行计划任务。因此,虽然您可能已登录并映射了 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
    

    【讨论】:

    • 对不起,你可以通过模仿我的环境来了解我的情况。 Powershell 通过具有远程共享的 Windows 7 上的任务计划程序运行。您提出的建议不能作为使用任务调度程序的计划任务,我已经尝试过...... :(
    • 你的开头段落解释了操作系统正在做什么的细节非常有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 2017-05-28
    • 1970-01-01
    • 2018-06-10
    相关资源
    最近更新 更多