簡體   English   中英

如何說服 powershell(通過任務調度程序運行)找到我的網絡驅動器?

[英]How can I convince powershell (run through task scheduler) to find my network drive?

我在 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: 驅動器。 如果有任何方法可以解決此問題,我將能夠將文件復制到那里....

網絡驅動器,以及實際上所有的驅動器號,都被“映射”到給定登錄會話的卷。 當您創建計划任務以運行時,它會創建一個新的登錄會話(即使您當前已登錄)並在該上下文中運行計划任務。 因此,雖然您可能已登錄並映射了 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

也許在腳本中運行 get-psdrive 之前,首先做這樣的事情:

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

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

$net.removenetworkdrive("Q:")

如果您不想在腳本中使用密碼,則有一個 hack,我更願意避免:

  • 以足夠的權限打開您的文件夾(例如域用戶)
  • 以管理員身份打開 powershell 並創建從 UNC 到本地路徑的符號鏈接

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

  • 您現在可以直接在 powershell 腳本中使用 UNC 路徑,它將使用計划任務中提供的憑據打開它。

計划任務中的憑據可能存在一些問題,但是在我看來,這仍然比腳本中明文或偽混淆的密碼要好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM