【问题标题】:Powershell modules in scheduled task计划任务中的 Powershell 模块
【发布时间】:2014-10-06 13:23:09
【问题描述】:

关于模块的一些东西我不太明白......

如果我是普通用户的话

get-module -listavailable 

我得到这样的结果:

Directory: C:\Windows\system32\WindowsPowerShell\v1.0\Modules

ModuleType Name                                ExportedCommands
---------- ----                                ----------------
Manifest   ADRMS                               {Update-ADRMS, Unins
Manifest   AppLocker                           {Set-AppLockerPolicy
Manifest   BestPractices                       {Get-BpaModel, Invok
Manifest   BitsTransfer                        {Add-BitsFile, Remov
Manifest   CimCmdlets                          {Get-CimAssociatedIn
Script     DSV
Script     DSVAsset                            {Get-HTMLPage, Get-H
Script     DSVDB                               {Execute-UpdateULLoC
Script     DSVHnas                             {Get-HNASFileScan, B
Script     DSVLog                              {Start-DSVTranscript
Script     Experimental.IO                     {Where-Wildcard, Get
Manifest   FailoverClusters                    {Add-ClusterDisk, Ad
Script     ISE                                 {New-IseSnippet, Imp
Manifest   Microsoft.PowerShell.Diagnostics    {Get-WinEvent, Get-C
Manifest   Microsoft.PowerShell.Host           {Start-Transcript, S
Manifest   Microsoft.PowerShell.Management     {Add-Content, Clear-
Manifest   Microsoft.PowerShell.Security       {Get-Acl, Set-Acl, G
Manifest   Microsoft.PowerShell.Utility        {Format-List, Format
Manifest   Microsoft.WSMan.Management          {Disable-WSManCredSS
Script     Module                              {New-PSScript, New-G
Script     PSDiagnostics                       {Disable-PSTrace, Di
Script     PSFTP                               {Send-FTPItem, Recei
Binary     PSScheduledJob                      {New-JobTrigger, Add
Manifest   PSWorkflow                          {New-PSWorkflowExecu
Manifest   PSWorkflowUtility                   Invoke-AsWorkflow
Manifest   ServerManager                       {Get-WindowsFeature,
Manifest   TroubleshootingPack                 {Get-Troubleshooting
Manifest   WebAdministration                   {Start-WebCommitDela

这就是我所期望的......

但是当从计划任务(与不同的用户)做同样的事情时,我得到了这个:

Directory: C:\Windows\system32\WindowsPowerShell\v1.0\Modules

ModuleType Name                                ExportedCommands                
---------- ----                                ----------------                
Manifest   BitsTransfer                        {Add-BitsFile, Remove-BitsTra...
Manifest   CimCmdlets                          {Get-CimAssociatedInstance, G...
Script     ISE                                 {New-IseSnippet, Import-IseSn...
Manifest   Microsoft.PowerShell.Diagnostics    {Get-WinEvent, Get-Counter, I...
Manifest   Microsoft.PowerShell.Host           {Start-Transcript, Stop-Trans...
Manifest   Microsoft.PowerShell.Management     {Add-Content, Clear-Content, ...
Manifest   Microsoft.PowerShell.Security       {Get-Acl, Set-Acl, Get-PfxCer...
Manifest   Microsoft.PowerShell.Utility        {Format-List, Format-Custom, ...
Manifest   Microsoft.WSMan.Management          {Disable-WSManCredSSP, Enable...
Script     PSDiagnostics                       {Disable-PSTrace, Disable-PSW...
Binary     PSScheduledJob                      {New-JobTrigger, Add-JobTrigg...
Manifest   TroubleshootingPack                 {Get-TroubleshootingPack, Inv...
Manifest   WebAdministration                   {Start-WebCommitDelay, Stop-W...

为什么这两者之间有区别?

我很困惑,因为我实际上感兴趣的模块是我自己创建并放入文件夹的模块:

C:\Windows\system32\WindowsPowerShell\v1.0\Modules

这似乎工作正常,除了通过计划任务运行。

我错过了什么?我忘记了什么?

进一步 - 我可以确认 $env:PSModulePath 对两者都是一样的:

C:\Users\GRIT.SVC.IPPlan\Documents\WindowsPowerShell\Modules;
C:\Windows\system32\WindowsPowerShell\v1.0\Modules\;
C:\Program Files\Common Files\Microsoft Lync Server 2013\Modules\;
C:\Program Files\Quest Software\Management Shell for AD\;
C:\Program Files\Microsoft Monitoring Agent\Agent\PowerShell\;
C:\Program Files\System Center Operations Manager 2012\Powershell\

当然除了用户路径。

【问题讨论】:

    标签: powershell scheduled-tasks powershell-module


    【解决方案1】:

    发现问题...

    它与 ExecutionPolicy 无关 - 直接路径也无法加载模块......

    简单多了,一旦找到了……

    问题是 64/32 位....

    模块位于 C:\Windows\System32\WindowsPowerShell\v1.0\Modules

    然而任务正在执行

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

    因此模块应该位于 C:\Windows\SysWOW64\WindowsPowerShell\v1.0\Modules

    但感谢您的关注。

    【讨论】:

    • 您如何确定它运行的是 64 位版本而不是 32 位版本?
    【解决方案2】:

    依赖模块自动发现是脆弱的。您的脚本应该明确定义它需要的所有模块,然后明确加载它们。

    如果一个模块没有被列出,可能是因为它没有被签名并且执行策略不允许它加载或被发现。尝试显式加载其中一个模块,看看会出现什么错误。

    【讨论】:

    • 啊,它可能是执行策略.. 我会测试明天我确实尝试包含模块的完整路径,但它仍然失败 - 我认为它有同样的错误,但我没有100% 确定。明天回来
    • 不是ExecutionPolicy,是设置为unrestricted。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多