none
Aktuelle Remote Sessions auslesen RRS feed

  • Frage

  • Hallo Zusammen

    Ich möchte auf einem W2K8 Server die aktuellen Sessions auslesen.

    Mit query session kann man die Benutzer mit ID, typ und Status auflisten.
    Jedoch sollte ich wissen, von welchem Gerät aus die Remoteverbindung stattfindet.

    Wenn man auf dem Server in Start>Administrative Tools>Terminal Services>Terminal Service Manager die Sessions (und nicht Users) anzeigen lässt,
    ist diese Information unter ClientName vorhanden.

    Vielen Dank & Gruss

    Donnerstag, 9. Februar 2012 10:29

Antworten

  • Da hatte ich dich wohl missverstanden. Ich bin davon ausgegangen du möchtest die Sessioninfos von einer zentralen Stelle aus, remote auf den Terminalservern auslesen.

    Wen du das also jedesmal bei der Anmeldung machen willst, warum liest du nicht durch ein simples script beim Login die Variable:

    $env:Clientname 

    aus und schreibst das Ergebnis dahin wo du es haben möchtest? Du must nur aufs timing des Scriptes achten, es darf nicht zu früh im Logonprocess laufen.

    > wegen den Rechenleistungen:Ich denke schon, dass ich diese so tief wie möglich halten sollte

    Das denke ich auch. "CPU-Last im Promillebereich" bedeutet "sehr sehr wenig" :)

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".



    Donnerstag, 9. Februar 2012 23:56
    Moderator

Alle Antworten

  • Geht mit dem PSTerminalServices-Modul von Shay. Für alles was mit TS/RD-Sessions zu tun hat, sehr gut geeignet.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Donnerstag, 9. Februar 2012 10:40
    Moderator
  • Super - Vielen Dank.
    Funktioniert genau so, wie ich mir es vorgestellt habe.

    Jedoch sollte ich ein Skript haben, welches alleinstehend funktioniert und nicht viel Rechenleistung beansprucht.
    Es gäbe eine Möglichkeit die Logfiles auszulesen, jedoch möchte ich nicht durch diese iterieren.

    Es würde auch schon reichen, den CientName aller aktuell verbundenen Clients auszulesen.

    Gruss

    Donnerstag, 9. Februar 2012 12:33
  • Die wtsapi32.dll enthält die Funktion WTSQuerySessionInformation die du Nutzen kannst.
    siehe hier (weiter unten): http://social.technet.microsoft.com/Forums/nl/ITCG/thread/3d49a8bd-9767-4db3-857d-a1bc44279507

    # Get-WtsClientAddress.ps1
    
    $WtsApiDef = @"
    using System;
    using System.Runtime.InteropServices;
    using System.Runtime.InteropServices.ComTypes;
    
    public enum WTS_INFO_CLASS
    {
      WTSInitialProgram,
      WTSApplicationName,
      WTSWorkingDirectory,
      WTSOEMId,
      WTSSessionId,
      WTSUserName,
      WTSWinStationName,
      WTSDomainName,
      WTSConnectState,
      WTSClientBuildNumber,
      WTSClientName,
      WTSClientDirectory,
      WTSClientProductId,
      WTSClientHardwareId,
      WTSClientAddress,
      WTSClientDisplay,
      WTSClientProtocolType,
      WTSIdleTime,
      WTSLogonTime,
      WTSIncomingBytes,
      WTSOutgoingBytes,
      WTSIncomingFrames,
      WTSOutgoingFrames,
      WTSClientInfo,
      WTSSessionInfo
    };
    
    [StructLayout(LayoutKind.Sequential)]
    public struct WTS_CLIENT_ADDRESS
    {
      public int AddressFamily;
      [MarshalAs(UnmanagedType.ByValArray, SizeConst=20)]
      public byte[] Address;
    };
    
    public class WtsApi
    {
      public static IntPtr WTS_CURRENT_SERVER_HANDLE = IntPtr.Zero;
      public static int WTS_CURRENT_SESSION = -1;
    
      [DllImport("wtsapi32.dll")]
      public static extern int WTSQuerySessionInformation(
        System.IntPtr hServer,
        int SessionId,
        int WTSInfoClass,
        out System.IntPtr ppBuffer,
        out int pBytesReturned);
    
      [DllImport("wtsapi32.dll")]
      public static extern void WTSFreeMemory(IntPtr pMemory);
    }
    "@
    
    add-type -typedefinition $WtsApiDef
    
    $WtsClientAddressPtr = [IntPtr]::Zero
    $BytesReturned = [int] 0
    
    $Result = [WtsApi]::WTSQuerySessionInformation(
      [WtsApi]::WTS_CURRENT_SERVER_HANDLE,
      [WtsApi]::WTS_CURRENT_SESSION,
      [WTS_INFO_CLASS]::WTSClientAddress,
      [ref] $WtsClientAddressPtr,
      [ref] $BytesReturned)
    
    if ($Result)
    {
      $WtsClientAddress = new-object WTS_CLIENT_ADDRESS
      $WtsClientAddress = [System.Runtime.InteropServices.Marshal]::PtrToStructure($WtsClientAddressPtr, ([WTS_CLIENT_ADDRESS]))
      [System.Net.IPAddress]::Parse("$($WtsClientAddress.Address[2]).$($WtsClientAddress.Address[3]).$($WtsClientAddress.Address[4]).$($WtsClientAddress.Address[5])")
      [WtsApi]::WTSFreeMemory($WtsClientAddressPtr)
    }


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info

    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace" "

    Donnerstag, 9. Februar 2012 15:45
  • Ich kenne keinen Weg (zumindest nicht ohne andere externe dlls oder Tools). Über WMI kommst du zwar auch in einige der Session-Infos, aber Imho nicht den Clientnamen. Ich verstehe auch nicht ganz dein Problem mit dem PSTS-Modul: CPU-Last ist im Promillebereich und installieren muß man sie auch nicht, einfaches kopieren der Dateien in den Module-Ordner reicht.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Donnerstag, 9. Februar 2012 15:54
    Moderator
  • Ich kann ihn da schon verstehen!
    Da bin ich genauso "gestrickt". Ich kreiere ungern Scripts, die von irgend einer nicht in Windows enthaltenen zusätzlichen Komponenete abhängig sind.
    Das vereinfacht das weitergeben des scriptes ungemein. ( Ich habe > 240 Admin Kollegen allein nur in deutschlend in unserer Domäne ...)


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info

    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace" "

    • Bearbeitet Peter Kriegel Donnerstag, 9. Februar 2012 16:10
    • Bearbeitet Denniver ReiningMVP, Moderator Freitag, 10. Februar 2012 00:14 Benutze bitte in deiner Signatur keine Codebox. Sonst erhält jeder Post von dir den neuen "Enthält CODE"-Flag, rechts oben.
    Donnerstag, 9. Februar 2012 16:09
  • Ich möchte nur eine Datei, da das Skript auf mehreren Server zum Einsatz kommen wird, und nach bestimmter Zeit auch wieder entfernt wird.

    Und wegen den Rechenleistungen: Ich denke schon, dass ich diese so tief wie möglich halten sollte, da sich unter Umständen 70 Benutzer auf diesem Server befinden und bei jeder Anmeldung das Script ausgeführt wird.

    Donnerstag, 9. Februar 2012 16:15
  • Wenn ich es so ausführe, bekomme ich die IPAdresse. Wie kann ich aber den ClientName auslesen?

    Verstehe das Skript nicht ganz.

    Donnerstag, 9. Februar 2012 16:46
  • Hmmm.. lass mich mal kurz überlegen ...Wie kommt man von einer IP zum Rechnernamen ?
    DNS ! oder ein kurzes Test Ping !

    (Test-Connection 127.0.0.1 -Count 1).__server


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info

    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace" "


    Donnerstag, 9. Februar 2012 17:49
  • Naja.

    Weshalb sollte ich noch Traffic verursachen (auch wenn es nicht viel ist), wenn es mit ausgelesen wird?

    Donnerstag, 9. Februar 2012 18:33
  • Da hatte ich dich wohl missverstanden. Ich bin davon ausgegangen du möchtest die Sessioninfos von einer zentralen Stelle aus, remote auf den Terminalservern auslesen.

    Wen du das also jedesmal bei der Anmeldung machen willst, warum liest du nicht durch ein simples script beim Login die Variable:

    $env:Clientname 

    aus und schreibst das Ergebnis dahin wo du es haben möchtest? Du must nur aufs timing des Scriptes achten, es darf nicht zu früh im Logonprocess laufen.

    > wegen den Rechenleistungen:Ich denke schon, dass ich diese so tief wie möglich halten sollte

    Das denke ich auch. "CPU-Last im Promillebereich" bedeutet "sehr sehr wenig" :)

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".



    Donnerstag, 9. Februar 2012 23:56
    Moderator
  • CPUs werden gebaut um zu arbeiten....
    Netzwerke werden für Traffic erstellt...

    Ressourcen schonen ist wichtig! Man kann alles übertreiben.....

    Ich steig aus!

    [ironie]
    PowerShell und .NET sind ebenfalls nicht sehr ressourcen schonend! Mach doch deine Skripte in Assambler! ;-))))
    [/ironie]


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info

    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace" "



    Freitag, 10. Februar 2012 06:04
  • Peter, ich hatte dich unten schon mal gebeten, aber falls du es übersehen hast, hier nochmal:

    Benutze bitte in deiner Signatur keine

    Codebox!

    Sonst erhält jeder Post von dir den "Enthält CODE"-Flag (rechts oben), was zu falschen Suchergebnissen bzw. Forenfiltern führt.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".


    Freitag, 10. Februar 2012 09:58
    Moderator
  • Hatte ich übersehen !
    Habs geändert!
    Schade das man in den MS Foren keine Privaten Nachrichten (PN) senden kann. Hat mich schon öfters geärgert!


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace


    Freitag, 10. Februar 2012 10:36
  • Hab doch gewusst, dass es nicht viel Aufwand sein kann.

    Danke!

    Freitag, 10. Februar 2012 13:27