簡體   English   中英

Xp_CmdShell Powershell腳本找不到有效的模塊

[英]Xp_CmdShell Powershell Script No Valid Module Found

我正在嘗試使用XP_CMDSHELL在T-SQL中運行PS1文件,如下所示:

exec xp_cmdshell 'powershell -ExecutionPolicy bypass -command "C:\Users\sleven\Documents\DimAcctImport.ps1"'

powershell腳本如下:

import-module dbatools
Import-DbaCsv -SqlInstance 'MSSQL' -Database 'Test' -Table 'Account' -Path "R:\Data\Account.csv" -Delimiter ',' -Quote '"' -KeepNulls -NoProgress

此腳本使用模塊DbaTools的cmdlet Import-DbaCSV將CSV導入到目標表。

這是我在SSMS中收到的錯誤:

import-module : The specified module 'dbatools' was not loaded because no valid module file was found in any module 
directory.
At C:\Users\sleven\Documents\DimAcctImport.ps1:1 char:1
+ import-module dbatools
+ ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ResourceUnavailable: (dbatools:String) [Import-Module], FileNotFoundException
    + FullyQualifiedErrorId : Modules_ModuleNotFound,Microsoft.PowerShell.Commands.ImportModuleCommand

如果我復制PowerShell腳本並在PS ISE中運行該模塊,則該模塊將安裝並按預期運行。

我正在與用於運行sp的本地PC在同一台PC上使用SQL Developer Edition。

我想念什么?

編輯:從get-module和$ PSVersionTable添加輸出

PS> (Get-Module -ListAvailable dbatools).Path:
C:\Users\sleven\Documents\WindowsPowerShell\Modules\dbatools\0.9.834\dbatools.psd1

PS> $PSVersionTable

Name                           Value                                                                                                  
----                           -----                                                                                                  
PSVersion                      5.1.18362.145                                                                                          
PSEdition                      Desktop                                                                                                
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}                                                                                
BuildVersion                   10.0.18362.145                                                                                         
CLRVersion                     4.0.30319.42000                                                                                        
WSManStackVersion              3.0                                                                                                    
PSRemotingProtocolVersion      2.3                                                                                                    
SerializationVersion           1.1.0.1 

使用Import-Module cmdlet告訴PowerShell僅在某些文件夾中查找cmdlet。 您可以通過檢查環境變量PSModulePath (添加分隔PSModulePath以獲得更好的可見性)來檢查這些文件夾:

$env:PSModulePath -split ';'

在那種情況下,當通過xp_cmdshell運行PowerShell時,該文件夾不包括在PSModulePath (如果您使用其他帳戶(因為模塊當前位於您的配置文件文件夾中)也可能發生)。 現在,您有兩個選擇:

  1. 使用模塊的路徑而不是名稱來引用模塊。 您可以使用(get-module -ListAvailable dbatools).path獲取路徑:
# Replace the path with the path you found with Get-Module
Import-Module 'C:\path\to\module\dbatools.psd1
  1. 修改$env:PSModulePath 由於該主題的范圍更廣,讓我為您提供docs的鏈接 請記住,應該為運行xp_cmdshell的用戶設置該變量。 如RThomas所述 ,默認情況下,它不是您的用戶帳戶。 有關該主題的說明,請參見鏈接的答案。

注意 (積分來自@David Browne-Microsoft從他的評論中獲得):

如果要設置環境變量,則它應該是系統環境變量,因為如果您更改SQL Server服務帳戶,您不會希望此過程中斷。 請記住,設置系統環境變量需要重新引導服務才能看到更改。

可能是帳戶問題。 請記住,默認情況下運行xp_cmdshell會將所有內容作為SQL Server實例后面的服務帳戶運行。 因此,您需要驗證這是什么帳戶。

如果它是內置的系統帳戶,則涉及權限時,可能會導致奇怪的行為。

如果是Windows帳戶或域帳戶,則需要通過運行PS文件而不是您本人而是以運行SQL Server用作服務帳戶的同一帳戶來對SQL Server進行外部測試。 您可以通過使用shift /右鍵單擊打開cmd shell並指定其他帳戶來輕松地做到這一點。

您的另一個選擇是為xp_cmdshell調用設置代理帳戶以使用。 有關如何執行此操作的說明,請參閱Microsoft文檔。

暫無
暫無

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

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