Soru Artık PowerShell oturumları nasıl kapatılır?


Uzak bir sunucuda birkaç 'Invoke-Command -asjob' kullanan bir betik oluşturuyordum, yine de While-Loop testi yapıp test etmem gerekiyordu. Ancak, şimdi hedef sunucuda bir Invoke-Command -asjob denediğimde, durumu başarısız olan iş döndürür. İşi Aldığımda, bu hata ile döner:

The WS-Management service cannot process the request. This user has exceeded the maximum number of concurrent shells allowed for this plugin. Close at least one open shell or raise the plugin quota for this user.
+ FullyQualifiedErrorId : -2144108060,PSSessionStateBroken

Get-PSSession yaptığımda hiçbiri listelenmiyor, bu yüzden Remove-PSSession'ı kullanamıyorum (bu, şu ana kadarki tek öneridir).

Temelde idam edilen budur:

While ($True)
    { 
    Invoke-Command -Computername $RemoteServer -AsJob {Get-ChildItem}
    }

Bundan kurtuldum ve Get-Job | Tüm işleri kaldıran İşi Kaldır, ancak uzak sunucuda hala bir Invoke-Command -AsJob başlatamıyorum.

Ayrıca çalışmayan WSMAN Hizmeti'ni (RDP ile oturum açarak) uzak sunucuda yeniden başlattım.


5
2017-12-06 13:11


Menşei


Son hedefiniz ne olursa olsun, bunun gidiş yolu bu değil. Oturumları, siz farklı bir işletim sistemi oturum kimliğinde bulunduğundan, sonlandırdığınız oturumları sonlandıramazsınız. Ancak, eninde sonunda zamanla dışarı çıkacaklar. Çok fazla çaba harcamadan ve gerçekten neyi başarmaya çalıştığınızı anlamanız için size bir sürü soru sormaya gerek duymaksızın oldukça fazla bahis oynayabiliyorsunuz. Probleminize farklı bir yaklaşım denemek isteyeceksiniz. - Colyn1337
Evet, neyi başarmaya çalıştığımı bilerek bıraktım, açıklamak için çok fazla olurdu. Sadece bilmek istiyorum, bu yüzden basitleştirme, eğer oturumları zaman aşımına uğratmak zorunda kalmadan kapatabilirsem. Açıkçası zaman aşımına uğradılar ve devam edebildim. Ama gelecekteki referans ve eğitimim için, gerçekten mümkün olmadığını bilmek istiyorum. Birisi diğer işletim sistemi oturum kimliğine (?) Bağlanamaz mı? - SuHwak


Cevaplar:


Uzak işler bir wsmprovhost.exe iş başına işlem. Bu işlemleri WMI ile sonlandırmak için kaba kuvvet kullanabilmelisiniz - hatta makineyi uzaktan yeniden başlatabilirsiniz. Tabii ki, diğer kullanıcılar / aktiviteler için barındırılan işleri öldürme riskini de üstleniyorsunuz.

Bu her şeyi sonlandıracaktı wsmprovhost.exe bilgisayardaki islemler (veya bilgisayar isimleri dizisi):

(gwmi win32_process -ComputerName $RemoteServer) |? 
    { $_.Name -imatch "wsmprovhost.exe" } |% 
    { $_.Name; $_.Terminate() }

4
2017-12-13 19:17



Ah teşekkürler! Yalnızca oluşturduğum uzak sunucudaki işlemi durdurmak için. Ben hala PS öğreniyorum, lütfen nazik olun: $RemoteUserProcesses = Invoke-Command -ComputerName $RemoteServer -ScriptBlock {get-process -IncludeUserName | ?{$_.Name -match "wsmprovhost" -and $_.UserName -match "UserName"}} $RemoteServerProcesses = Get-WmiObject win32_process -ComputerName $RemoteServer foreach ($RemoteUserProces in $RemoteUserProcesses) { Get-WmiObject win32_process -ComputerName $RemoteServer | ?{$_.processid -eq $RemoteUserProces.Id} | %{ $_.Name; $_.Terminate() } } - SuHwak
Oh bekle, aslında yapabilir miyim invoke-command -computername $RemoteServer  Seanslarımın $ RemoteServer'a çıkarılmış olsaydı? Muhtemelen öyle değil, sanırım yukarıdakileri görmezden geliyorum :) Ama sahip olduğum puan! - SuHwak
Zaten oturumlarda çoktan çıktığını varsayıyordum. % 100 emin değilim, WMI çağrısını bile yapabileceksiniz, ancak bu işin yapıldığı gibi özel bir süreç olmayacak olan WMI sağlayıcı ana bilgisayarına gitmelidir. - Matthew Wetmore


Bu yazının biraz eski olduğunu biliyorum. @Matthew Wetmore çıkarmak için harika bir çözüm var HERŞEY Uzak sunucudan PSSessions. Ancak, @SuHwak'ın, yalnızca belirli bir kullanıcının ürettiği oturumları nasıl durduracağı sorusu vardı.

Bu amaçla, yardımcı olacak bir işlev yazdım.

function Get-PSSessionsForUser
{
    param(
        [string]$ServerName,
        [string]$UserName
    )

    begin {
        if(($UserName -eq $null) -or ($UserName -eq ""))
        { $UserName = [Environment]::UserName }
        if(($ServerName -eq $null) -or ($ServerName -eq ""))
        { $ServerName = [Environment]::MachineName }
    }

    process {
        Get-CimInstance  -ClassName Win32_Process -ComputerName $ServerName | Where-Object { 
            $_.Name -imatch "wsmprovhost.exe"
        } | Where-Object {
            $UserName -eq (Invoke-CimMethod -InputObject $_ -MethodName GetOwner).User
        }
    }
}

Ve kullanmak için ....

#Get, but do not terminate sessions for the current user, on the local computer.
Get-PSSessionsForUser

#Terminate all sessions for for the current user, on the local computer.
(Get-PSSessionsForUser) | Invoke-CimMethod -MethodName Terminate

<####################################>

#Get, but do not terminate sessions for a specific user, on the local computer.
Get-PSSessionsForUser -UserName "custom_username"

#Terminate all sessions for a specific user, on the local computer.
(Get-PSSessionsForUser -UserName "custom_username") | Invoke-CimMethod -MethodName Terminate

<####################################>

#Get, but do not terminate sessions for the current user, on a remote server.
Get-PSSessionsForUser -ServerName "remote_server"

#Terminate all sessions for the current user, on a remote server.
(Get-PSSessionsForUser -ServerName "remote_server") | Invoke-CimMethod -MethodName Terminate

<####################################>

#Get, but do not terminate sessions for a specific user, on a remote server.
Get-PSSessionsForUser -UserName "custom_username" -ServerName "remote_server"

#Terminate all sessions for a specific user, on a remote server.
(Get-PSSessionsForUser -UserName "custom_username" -ServerName "remote_server") | Invoke-CimMethod -MethodName Terminate

0
2017-10-31 12:50