2012-09-06 233 views
2

我在VB.net中使用Power Shell连接到Office 365实例。此工作正常,但运行此服务的服务的内存使用量不断增加。我正在使用以下代码启动和关闭电源shell。close方法等工作不正常。使用PowerShell时发生内存泄漏

Private Function initRunSpace(ByVal user_name As String, ByVal password_user As String) As String 
    Dim StringBuilder As New StringBuilder 
    Dim liveIdconnectionUri As String = "https://ps.outlook.com/powershell" 
    Dim password As New SecureString() 
    Dim str_password As String = password_user 
    Dim username As String = user_name 
    Dim credential As New PSCredential(username, password) 
    Dim iss As InitialSessionState = Nothing 
    Dim psSession As New PSCommand() 
    Dim setVar As New PSCommand() 
    Dim importSession As New PSCommand() 

    Try 
     For Each x As Char In str_password 
      password.AppendChar(x) 
     Next 

     iss = InitialSessionState.CreateDefault 
     iss.ImportPSModule(New String() {"MSOnline"}) 

     runspace = RunspaceFactory.CreateRunspace(iss) 
     runspace.Open() 
      powershell = System.Management.Automation.PowerShell.Create() 
     powershell.Runspace = runspace 
     REM connect to exchange server in the cloud 

     psSession.AddCommand("New-PSSession") 
     psSession.AddParameter("ConfigurationName", "Microsoft.Exchange") 
     psSession.AddParameter("ConnectionUri", New Uri(liveIdconnectionUri)) 
     psSession.AddParameter("Credential", credential) 
     psSession.AddParameter("Authentication", "Basic") 
     psSession.AddParameter("AllowRedirection") 
     powershell.Commands = psSession 
     Dim result = powershell.Invoke() 
     Dim errors As Collection(Of ErrorRecord) = Nothing 
     errors = powershell.Streams.Error.ReadAll() 

     If errors.Count > 0 Then 
      REM Save the order or action for later execution 
      For Each obj As Object In errors 
       If obj IsNot Nothing Then StringBuilder.AppendLine(obj.ToString) 
      Next 
      powershell.Stop() 
      powershell.Dispose() 
      runspace.Close() 
      runspace.Dispose() 

      Return "Import-PSSession:" & StringBuilder.ToString 
      End If 
      Catch ex As Exception 
      Throw ex 
      Finally 
      StringBuilder = Nothing 
      liveIdconnectionUri = Nothing 
      password = Nothing 
      str_password = Nothing 
      username = Nothing 
      credential = Nothing 
      iss = Nothing 
      psSession = Nothing 
      setVar = Nothing 
      importSession = Nothing 
      End Try 
      Return "" 
     End Function 




    Public Sub CloseRunspace() 

    Dim removesession As New PSCommand() 
    Try 

     If powershell IsNot Nothing Then 
      removesession.Commands.AddScript("Remove-PSSession $sa;Remove-Variable $sa;Remove-Module -Name MSOnline;") 
      powershell.Commands = removesession 
      powershell.Runspace = runspace 
      Dim results As Collection(Of PSObject) = powershell.Invoke() 

     End If 
    Catch ex As Exception 
    Finally 
     removesession = Nothing 
     powershell.Stop() 
     powershell.Dispose() 

     runspace.Close() 
     runspace.Dispose() 
     GC.Collect() 
     Thread.Sleep(100) 
    End Try 
    End Sub 
+0

你曾经调用'CloseRunspace()'吗?我在这段代码中没有看到它。如果你有*错误,你会处置所有的事情,但如果没有错误,你就不会这样做。 – alroc

+0

是的,我打电话给它。问题是,即使调用它,它也不会完全释放内存,每次调用initrunspace()时都会继续增长。 – agupta

回答

3

Microsoft有一个已知问题,虽然未发布,但导入-PSsession命令存在问题。它咀嚼了很多内存,甚至在关闭和处理运行空间,powershell和管道后也不会释放它。我甚至尝试过显式调用GC.Collect ...但没有帮助。我在网络上的一些地方发现了它的一些提示。

http://social.msdn.microsoft.com/Forums/en-US/sbappdev/thread/3c143111-eb14-4235-8084-5edec8202f8b http://go4answers.webhost4life.com/Example/re-establish-failed-remote-powershell-80988.aspx

最后发出的呼叫到MS和他们说不要关机,如果你不就得了。尽可能重复使用相同的运行空间......尽管如果您在程序中动态使用PowerShell会话并且空闲一段时间,比如在制作Exchange 2010 PowerShell管理命令的Web应用程序中,PowerShell会话会超时。

让我们知道您是否找到解决方法。

+0

根据您的需要,您可能可以使用[RunspaceFactory.CreateOutOfProcessRunspace()](http://msdn.microsoft.com/en-us/library/hh470829(v = vs.85).aspx)。它在一个全新的PowerShell进程中创建一个运行空间,然后使用看起来像PowerShell远程处理的东西来回传给调用进程。所以,当你使用远程PowerShell(复杂对象以反序列化的PSObjects等形式回来)时,你必须处理同样的问题,但是任何可能泄漏内存的东西都会在该过程中泄漏它,当你丢弃时'重做。 –

0

我会建议尽可能不要使用“Import-PSSession”。相反,请使用“Invoke-Command”远程执行powershell脚本而不导入它们。

导入是一个代价高昂的操作,它可以避免。

相关问题