views:

2551

answers:

2

I need to be able to logoff any user from his windows session from a program.

I know I could log in as an admin and force a remote logoff. Is there any other way to force a logoff without logging in?

The tool will run as admin so that's not a problem, being able to remote logoff without logging in is.

Tool is in .NET, but any other way is welcome (JScript, command line tool to run from PInvoke, etc.)

+3  A: 

Perhaps with Sysinternals' PsTools, particularly PsShutdown?

PhiLho
Yes, this seems to work too.
Vinko Vrsalovic
+1  A: 

Finally found out this script in this page: http://www.robvanderwoude.com/files/logoff_vbs.txt

I decided to store it as a string inside the tool and make it write it to disk, execute it and delete it. Not particularly elegant (yes, yes, ugly as hell), but good enough for now.

' Logoff.vbs, Version 1.00
' Logoff current user on any WMI enabled computer on the network
'
' Adapted from posts by Alex Angelopoulos on www.developersdex.com
' and Michael Harris on microsoft.public.scripting.vbscript
'
' Written by Rob van der Woude
' http://www.robvanderwoude.com

' Check command line parameters
Select Case WScript.Arguments.Count
    Case 0
     ' Default is local computer if none specified
     strComputer = "."
    Case 1
     Select Case WScript.Arguments(0)
      ' "?", "-?" or "/?" invoke online help
      Case "?"
       Syntax
      Case "-?"
       Syntax
      Case "/?"
       Syntax
      Case Else
       strComputer = WScript.Arguments(0)
     End Select
    Case Else
     ' More than 1 argument is not allowed
     Syntax
End Select

' Define some constants that can be used in this script;
' logoff = 0 (no forced close of applications) or 5 (forced);
' 5 works OK in Windows 2000, but may result in power off in XP
Const EWX_LOGOFF   = 0
Const EWX_SHUTDOWN = 1
Const EWX_REBOOT   = 2
Const EWX_FORCE    = 4
Const EWX_POWEROFF = 8

' Connect to computer
Set OpSysSet = GetObject("winmgmts:{(Shutdown)}//" & strComputer & "/root/cimv2").ExecQuery("select * from Win32_OperatingSystem where Primary=true")

' Actual logoff
for each OpSys in OpSysSet
    OpSys.Win32Shutdown EWX_LOGOFF
next

' Done
WScript.Quit(0)


Sub Syntax
msg = vbCrLf & "Logoff.vbs,  Version 1.00" & vbCrLf & _
      "Logoff the current user of any WMI enabled computer on the network." & _
      vbCrLf & vbCrLf & "Usage:  CSCRIPT  LOGOFF.VBS  [ computer_name ]" & _
      vbCrLf & vbCrLf & _
      "Where:  " & Chr(34) & "computer_name" & Chr(34) & _
      "  is the name of the computer to be logged off" & vbCrLf & _
      "                         (without leading backslashes); default is " & _
      Chr(34) & "." & Chr(34) & vbCrLf & _
      "                         (the local computer)." & vbCrLf & vbCrLf & _
      "Written by Rob van der Woude" & vbCrLf & _
      "http://www.robvanderwoude.com" & vbCrLf & vbCrLf & _
      "Based on posts by Alex Angelopoulos on www.developersdex.com" & _
      vbCrLf & _
      "and Michael Harris on microsoft.public.scripting.vbscript" & vbCrLf
Wscript.Echo(msg)
Wscript.Quit(1)
End Sub
Vinko Vrsalovic