我正在使用VB.net中的电源 shell 连接到Office 365实例。此方法工作正常,但正在运行该服务的服务的内存使用量一直在增加。我正在使用以下代码来启动和关闭电源 shell 。例如close方法无法正常工作。
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
最佳答案
Microsoft有一个已知问题,尽管尚未发布,但import-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 session ,并且超时一段时间,则Powershell session 将超时,例如在进行Exchange 2010 Powershell管理命令的Web应用程序中。
如果您找到解决方法,请告诉我们。
关于.net - 使用PowerShell时的内存泄漏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12309310/