Session À Distance De Déconnexion De Powershell
j'essaie de formuler une commande Powershell pour déconnecter un utilisateur à distance. Nous avons un serveur de terminal avec un programme très instable qui bloque parfois les sessions. Nous devons déconnecter à distance un utilisateur mais j'essaie d'écrire une déclaration Powershell qui va déconnecter la personne qui a lancé le script. J'ai cherché sur Google, et j'ai trouvé cette commande:
Invoke-Command -ComputerName MyServer -Command {shutdown -l}
Toutefois, la commande renvoie "fonction incorrecte."Je peux exécuter d'autres commandes avec succès dans les crochets, comme Get-Process.
l'idée est pour moi de mettre cela dans un script que les utilisateurs peuvent exécuter pour se déconnecter du serveur (depuis quand il se bloque, ils ne peuvent pas accéder au menu Démarrer ou ALT+CTRL+END pour le faire à travers l'interface graphique).
Le flux serait ce: Bob se connecte à MyServer via RDP mais sa session se bloque. Sur son bureau local, il peut exécuter MyScript (contenant une commande similaire à celle ci-dessus) qui déconnectera sa session sur MyServer.
10 réponses
peut-être étonnamment, vous pouvez déconnecter les utilisateurs avec la commande logoff
.
C:\> logoff /?
Terminates a session.
LOGOFF [sessionname | sessionid] [/SERVER:servername] [/V] [/VM]
sessionname The name of the session.
sessionid The ID of the session.
/SERVER:servername Specifies the Remote Desktop server containing the user
session to log off (default is current).
/V Displays information about the actions performed.
/VM Logs off a session on server or within virtual machine.
The unique ID of the session needs to be specified.
l'ID de session peut être déterminé avec les commandes qwinsta
( query session
) ou quser
( query user
) (voir ici ):
$server = 'MyServer'
$username = $env:USERNAME
$session = ((quser /server:$server | ? { $_ -match $username }) -split ' +')[2]
logoff $session /server:$server
Voici une excellente solution scénarisée pour déconnecter les gens à distance ou localement. J'utilise qwinsta pour obtenir des informations de session et construire un tableau à partir de la sortie donnée. Cela rend vraiment facile d'itérer à travers chaque entrée et de se déconnecter seulement les utilisateurs réels, et pas le système ou L'auditeur RDP lui-même qui jette généralement juste une erreur Accès refusé de toute façon.
$serverName = "Name of server here OR localhost"
$sessions = qwinsta /server $serverName| ?{ $_ -notmatch '^ SESSIONNAME' } | %{
$item = "" | Select "Active", "SessionName", "Username", "Id", "State", "Type", "Device"
$item.Active = $_.Substring(0,1) -match '>'
$item.SessionName = $_.Substring(1,18).Trim()
$item.Username = $_.Substring(19,20).Trim()
$item.Id = $_.Substring(39,9).Trim()
$item.State = $_.Substring(48,8).Trim()
$item.Type = $_.Substring(56,12).Trim()
$item.Device = $_.Substring(68).Trim()
$item
}
foreach ($session in $sessions){
if ($session.Username -ne "" -or $session.Username.Length -gt 1){
logoff /server $serverName $session.Id
}
}
dans la première ligne de ce script donner $serverName la valeur appropriée ou localhost si exécuté localement. J'utilise ce script pour le coup les utilisateurs avant d'un processus automatisé tente de déplacer certains dossiers. Empêche "fichier en cours d'utilisation" erreurs pour moi. Une autre note, ce script devra être lancé en tant qu'utilisateur administrateur sinon vous pouvez être accédé nié en essayant de déconnecter quelqu'un. Espérons que cette aide!
ajouter des commandes DOS simples, si quelqu'un est ainsi incliné. Oui, cela fonctionne toujours pour Win 8 et Server 2008 + Server 2012.
Query session /server:Server100
Sera de retour:
SESSIONNAME USERNAME ID STATE TYPE DEVICE
rdp-tcp#0 Bob 3 Active rdpwd
rdp-tcp#5 Jim 9 Active rdpwd
rdp-tcp 65536 Listen
et pour déconnecter une session, utilisez:
Reset session 3 /server:Server100
c'est de la vieille école et est antérieur à PowerShell, mais j'ai utilisé le combo qwinsta / rwinsta pendant des années pour déconnecter à distance les sessions RDP vétustes. Il est intégré sur au moins Windows XP et forward (éventuellement plus tôt)
déterminer L'ID de session:
qwinsta /SERVER:<NAME>
supprimer la session en question:
rwinsta <SESSION_ID> /SERVER:<NAME>
Essayez le Services Terminal server Module PowerShell :
Get-TSSession -ComputerName comp1 -UserName user1 | Stop-TSSession -Force
vous pouvez utiliser Invoke-RDUserLogoff
exemple de journalisation des utilisateurs D'Active Directory d'une unité organisationnelle spécifique:
$users = Get-ADUser -filter * -SearchBase "ou=YOUR_OU_NAME,dc=contoso,dc=com"
Get-RDUserSession | where { $users.sAMAccountName -contains $_.UserName } | % { $_ | Invoke-RDUserLogoff -Force }
à l'extrémité de la pipe, si vous essayez d'utiliser seulement foreach (%), il se déconnectera seulement un utilisateur. Mais en utilisant cette combinaison de foreach et pipe:
| % { $_ | commande }
fonctionnera comme prévu.
Ps. Exécuter en tant qu'Admissible
j'ai modifié Casey réponse à seulement déconnexion des sessions déconnectées de la manière suivante:
foreach($Server in $Servers) {
try {
query user /server:$Server 2>&1 | select -skip 1 | ? {($_ -split "\s+")[-5] -eq 'Disc'} | % {logoff ($_ -split "\s+")[-6] /server:$Server /V}
}
catch {}
}
déconnecter tous les utilisateurs d'une machine:
try {
query user /server:$SERVER 2>&1 | select -skip 1 | foreach {
logoff ($_ -split "\s+")[-6] /server:$SERVER
}
}
catch {}
détails:
- le
try
/catch
est utilisé lorsqu'il n'y a pas d'utilisateurs sont sur le serveur, et lequery
renvoie une erreur. cependant, vous pouvez laisser tomber la partie2>&1
, et supprimer letry
/catch
si vous ne vous gênez pas de voir la chaîne d'erreur -
select -skip 1
supprime la ligne d'en-tête - le intérieur
foreach
se connecte chaque utilisateur -
($_ -split "\s+")
divise la chaîne à un tableau avec juste des éléments de texte -
[-6]
index obtient l'ID de session et est la 6ème chaîne de comptage à partir de l'inverse du tableau, vous devez le faire parce que la sortiequery
aura soit 8 ou 9 éléments selon si les utilisateurs connectés ou déconnectés de la session du terminal
puisque nous sommes dans la zone de PowerShell, c'est très utile si nous pouvons rendre un objet de PowerShell approprié ...
j'aime personnellement cette méthode d'analyse, pour la terseness:
((quser) -replace '^>', '') -replace '\s{2,}', ',' | ConvertFrom-Csv
Note: cela ne tient pas compte des utilisateurs déconnectés ("disque"), mais fonctionne bien si vous voulez juste obtenir une liste rapide des utilisateurs et ne se soucient pas du reste de l'information. Je voulais juste une liste et ne se soucient pas si elles étaient actuellement déconnecté.
si vous vous souciez du reste des données, c'est juste un peu plus complexe:
(((quser) -replace '^>', '') -replace '\s{2,}', ',').Trim() | ForEach-Object {
if ($_.Split(',').Count -eq 5) {
Write-Output ($_ -replace '(^[^,]+)', ',')
} else {
Write-Output $_
}
} | ConvertFrom-Csv
je vais un peu plus loin et vous donne un objet très propre sur mon blog.
ci-dessous le script fonctionnera bien pour les sessions actives et déconnectées aussi longtemps que l'Utilisateur a accès à distance à la commande run logoff. Tout ce que vous avez à faire est de changer le servername de "votre ServerName" sur la quatrième ligne.
param (
$queryResults = $null,
[string]$UserName = $env:USERNAME,
[string]$ServerName = "YourServerName"
)
if (Test-Connection $ServerName -Count 1 -Quiet) {
Write-Host "`n`n`n$ServerName is online!" -BackgroundColor Green -ForegroundColor Black
Write-Host ("`nQuerying Server: `"$ServerName`" for disconnected sessions under UserName: `"" + $UserName.ToUpper() + "`"...") -BackgroundColor Gray -ForegroundColor Black
query user $UserName /server:$ServerName 2>&1 | foreach {
if ($_ -match "Active") {
Write-Host "Active Sessions"
$queryResults = ("`n$ServerName," + (($_.trim() -replace ' {2,}', ','))) | ConvertFrom-Csv -Delimiter "," -Header "ServerName","UserName","SessionName","SessionID","CurrentState","IdealTime","LogonTime"
$queryResults | ft
Write-Host "Starting logoff procedure..." -BackgroundColor Gray -ForegroundColor Black
$queryResults | foreach {
$Sessionl = $_.SessionID
$Serverl = $_.ServerName
Write-Host "Logging off"$_.username"from $serverl..." -ForegroundColor black -BackgroundColor Gray
sleep 2
logoff $Sessionl /server:$Serverl /v
}
}
elseif ($_ -match "Disc") {
Write-Host "Disconnected Sessions"
$queryResults = ("`n$ServerName," + (($_.trim() -replace ' {2,}', ','))) | ConvertFrom-Csv -Delimiter "," -Header "ServerName","UserName","SessionID","CurrentState","IdealTime","LogonTime"
$queryResults | ft
Write-Host "Starting logoff procedure..." -BackgroundColor Gray -ForegroundColor Black
$queryResults | foreach {
$Sessionl = $_.SessionID
$Serverl = $_.ServerName
Write-Host "Logging off"$_.username"from $serverl..."
sleep 2
logoff $Sessionl /server:$Serverl /v
}
}
elseif ($_ -match "The RPC server is unavailable") {
Write-Host "Unable to query the $ServerName, check for firewall settings on $ServerName!" -ForegroundColor White -BackgroundColor Red
}
elseif ($_ -match "No User exists for") {Write-Host "No user session exists"}
}
}
else {
Write-Host "`n`n`n$ServerName is Offline!" -BackgroundColor red -ForegroundColor white
Write-Host "Error: Unable to connect to $ServerName!" -BackgroundColor red -ForegroundColor white
Write-Host "Either the $ServerName is down or check for firewall settings on server $ServerName!" -BackgroundColor Yellow -ForegroundColor black
}
Read-Host "`n`nScript execution finished, press enter to exit!"
quelques exemples de sorties. Pour une session active:
pour les sessions déconnectées:
si aucune session trouvée: Vérifiez cette solution aussi bien pour interroger tous les serveurs publicitaires pour votre nom d'utilisateur et logoff seulement les sessions déconnectées. Le script vous indiquera également s'il y a eu une erreur de connexion ou d'interrogation du serveur.
Powershell pour en savoir déconnecté session RDP et fermer la session dans le même temps