Import-Module无法在WinForms应用程序中运行

时间:2017-11-23 00:17:30

标签: vb.net powershell

我有一个VB.net应用程序,我从我的vb.net窗口应用程序中调用PowerShell上的Import-Module,但错误说它无法找到该模块。错误如下。

  

Import-Module:指定的模块' MSOnline'未加载,因为在任何模块目录中找不到有效的模块文件。

enter image description here

当我通过常规方式从外部启动PowerShell加载相同的模块时,它可以正常工作。图片如下。

enter image description here

VB脚本如下

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim procStartInfo As New ProcessStartInfo
    Dim procExecuting As New Process

    With procStartInfo
        .UseShellExecute = True
        .FileName = "powershell.exe"
        .WindowStyle = ProcessWindowStyle.Normal
        .Verb = "runas" 'add this to prompt for elevation
        Dim psscript As String = My.Resources.mymsolPS
        procStartInfo.Arguments = psscript
        procExecuting = Process.Start(procStartInfo)
    End With

End Sub

我的PowerShell脚本作为txt文件保存在my.resource中。我的PowerShell脚本如下所示。

Import-Module Msonline
Connect-msolService

我将PowerShell脚本替换为Get-Help,只有当我使用Import-Module Msonline时才能正常工作。

可以共享的另一个信息是模块存储在以下位置。

  

C:\ Windows \ System32下\ WindowsPowerShell \ V1.0 \模块\ MSOnline \ MSOnline.psd1

非常感谢任何帮助。 在此先感谢

更新2: 更多的摆弄它发现了一些我不确定是否相关的事情。

如果我从我的VB.net中启动powershell并运行以下命令,我就无法看到MSOnline模块。

PS C:\windows\system32>> cd $env:WINDIR\System32\WindowsPowerShell\v1.0\Modules\
PS C:\windows\System32\WindowsPowerShell\v1.0\Modules>> dir

如果我直接从我的系统运行PowerShell并运行上面的脚本,我可以看到模块

d-----       11/22/2017   2:59 PM                MSOnline

对我来说仍然是个谜,我无法破解。 :(

2 个答案:

答案 0 :(得分:0)

我注意到的差异是从您的应用程序启动时,或者在本地启动时,该目录是您的用户或系统..所以可能PS正在加载它无法找到模块。

如果您提供模块的完整路径怎么样?

我使用RunSpace运气好得多 - 我用它来传递任何powershell命令 - 这里是其中一个站点的片段和一些例子:

'Create the runspace.
Using R As System.Management.Automation.Runspaces.Runspace = _
System.Management.Automation.Runspaces.RunspaceFactory.CreateRunspace()

   'Create the pipeline
   Using P As System.Management.Automation.Runspaces.Pipeline = R.CreatePipeline()

      'Open the runspace.
      R.Open()

      'Create each command (in this case just one)...
      Dim Cmd As New System.Management.Automation.Runspaces.Command("C:\script.ps1", True)

      '...and add it to the pipeline.
      P.Commands.Add(Cmd)

      'Execute the commands and get the response.
      Dim Result As System.Collections.ObjectModel.Collection(Of _
      System.Management.Automation.PSObject) = P.Invoke()

      'Close the runspace.
      R.Close()

      'Display the result in the console window.
      For Each O As System.Management.Automation.PSObject In Result
         Console.WriteLine(O.ToString())
      Next

   End Using
End Using

最后一个提供了它正在做的非常可靠的细分。如果你不能让它工作,请告诉我,我可以尝试查看此导入是否适用于某个应用。

答案 1 :(得分:0)

我实际上经过数小时的疼痛后找到了解决方案。这是非常愚蠢的解决方案。

我去了我的应用程序属性我发现首选运行设置为32位因此当我从其中启动我的PowerShell时,它正在SYSWOW下寻找模块,它假设在System32下查看它。我取消选中" Preferred 32 BIT"而不是从系统32导入模块。

以为我应该分享这个愚蠢的错过,以便其他人不应该遭受同样的痛苦。