Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Remote Desktop Sessions erkennen

138 views
Skip to first unread message

Fritz Hilgemann

unread,
Dec 8, 2009, 1:29:45 PM12/8/09
to
Hallo,

ich komme einfach nicht weiter bei dem Versuch, auf einem entfernten Server
zu ermitteln, welche Remote Desktop Verbindungen da momentan offen sind. Ich
habe zwei Varianten versucht:
1. NetEnumSession() aus der netapi32.dll gibt mir eine Reihe von Sessions
zur�ck, aber die Parameter der SESSION_INFO_502 Struktur sagen m.E. nichts
dar�ber aus, welche davon ein RDC Verbindung ist. Ich bin nicht einmal
sicher, ob RDC �berhaupt damit zu ermitteln sind.
2. Mit WMI:
a) "select logonid, logontype from win32_logonsession"
b)"associators of {Win32_LogonSession.LogonId= ..."
Hier bekomme ich viele Sessions zur�ck, eine davon mit logontype = 10, das
wird sie wohl sein. Leider gibt mir die Liste der Associators keinen Account
oder Usernamen bekannt, sondern nur Namen von ausf�hrbaren Dateien.

Wie komme ich weiter? Oder mu� ich es ganz anders angehen?

Danke und Gru�,
Fritz

Frank Dzaebel

unread,
Dec 9, 2009, 1:47:53 AM12/9/09
to
Hallo Fritz,

> [...] 2. Mit WMI:


> a) "select logonid, logontype from win32_logonsession"
> b)"associators of {Win32_LogonSession.LogonId= ..."
> Hier bekomme ich viele Sessions zur�ck, eine davon mit logontype =
> 10, das wird sie wohl sein. Leider gibt mir die Liste der
> Associators keinen Account oder Usernamen bekannt, sondern nur Namen
> von ausf�hrbaren Dateien.

Das ist aber IMHO schon ein m�glicher Ansatz (ungepr�ft).
Im folgenden Script z.B. �ber "LogonType = 10" abfragen und
dann [objItem.Name, objItem.FullName, objItem.Domain]
auf die Namen zugreifen. Analog:

[Decrypt my World : How to get the logged on user with WMI (VBScript)]
http://blogs.msdn.com/alejacma/archive/2008/03/04/how-to-get-the-logged-on-user-with-wmi-vbscript.aspx

Hier auch eine M�glichkeit, wie NetSessionEnum benutzt werden kann:

[PsLoggedOn]
http://technet.microsoft.com/de-de/sysinternals/bb897545.aspx


ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Fritz Hilgemann

unread,
Dec 9, 2009, 6:37:13 AM12/9/09
to
Hallo Frank,

Danke f�r Deine Tips. Leider f�hrt es aber nicht zum Erfolg:
1. Wenn man alle Associators der Sessions Typ 10 durchackert, hat keines
davon Attribute FullName oder Domain. Associators der Klasse
Win32_LoggedOnUser gibt es hier gar nicht.
2. Die anderen Associators verweisen s�mtlich auf irgendwelche Executables,
die gerade in der jeweiligen Session laufen (dar�ber bekommt man allerdings
sehr ersch�pfend Auskunft).
3. Es gibt sehr wohl andere Sessions, wo solche Objekte definiert sind, z.B.
System oder Local Service (will sagen, syntakisch ist die Query wohl ok).
4. Mit den PSTools komme ich auch nicht weiter, die Ausgabe ist immer
identisch, egal ob mit oder ohne RDC Connection.
5. Im �brigen, die �ber WMI ermittelten Typ 10 Sessions bleiben auch
bestehen, wenn man eine RDC Verbindung trennt. Sie wird nur dann gel�scht,
wenn man richtig ausloggt. D.h., ich br�uchte auch noch so etwas wie einen
Status. Denn meine eiegtnlcihe Fragestellung ist "Ist jemand per RDC
verbunden?" Den RDC Status gibt es wohl auf dem Server ("active"), aber in
all den Objekten, die ich bekomme, steht bei Status nichts.

Hmh, wichtigste Frage erst einmal w�re Punkt 1.

Viele Gr��e,
Fritz

"Frank Dzaebel" <Po...@FranksSeite.de> wrote in message
news:%23r$OPuJeK...@TK2MSFTNGP06.phx.gbl...

Thomas Scheidegger

unread,
Dec 9, 2009, 8:34:55 AM12/9/09
to
Hallo Fritz


> Oder mu� ich es ganz anders angehen?

ungepr�ft, nur zur Vollst�ndigkeit (etwa falls keine .NET L�sung geht):
Remote Desktop Services API Functions
http://msdn.microsoft.com/en-us/library/aa383454(VS.85).aspx

--
Thomas Scheidegger - 'NETMaster'
http://dnetmaster.net/

FrankDzaebel

unread,
Dec 9, 2009, 9:37:11 AM12/9/09
to
Hallo Fritz,

> 1. Wenn man alle Associators der Sessions Typ 10 durchackert, hat keines
> davon Attribute FullName oder Domain. Associators der Klasse
> Win32_LoggedOnUser gibt es hier gar nicht.

Bei mir schon. [Win XP zum Beispiel].
[WMI Tools / WMI CIM Studio]
/ Win32_LogonSession -> GetInstances
/ Doppelklick auf eine Instanz
/ Registerkarte Associations /
... dann sieht man den Accountnamen, Domäne
und SID des Aufrufers. Das ganze wird über die
Win32_LoggedOnUser verknüpft auf
Win32_Account.

Die Verknüpfung ist hier auch dokumentiert:

[Win32_LoggedOnUser Class (Windows)]
http://msdn.microsoft.com/en-us/library/aa394172(VS.85).aspx

Hier ggf. ein Tool, mit dem Du das schnell prüfen kannst:

[Download details: WMI Administrative Tools]
http://www.microsoft.com/downloads/details.aspx?familyid=6430F853-1120-48DB-8CC5-F2ABDC3ED314
_______________

Ansonsten könnte auch folgender Hinweis
für Dich interessant sein, der hatte damals
für den User geklappt:

[Anzahl Benutzer auf dem Terminalserver in C#]
http://www.eggheadcafe.com/software/aspnet/33897117/anzahl-benutzerr-auf-dem.aspx

> 2. Die anderen Associators verweisen sämtlich auf irgendwelche Executables,

such noch mal, es sollte ein Win32_Account dabei sein.

Fritz Hilgemann

unread,
Dec 10, 2009, 7:44:10 AM12/10/09
to
Hallo Frank,

sorry, hat etwas gedauert. Das WMI Tool ist ja prima. Jetzt kann ich ganz
genau sehen: Mit dem WMI Tool sehe ich 6 Associations, darunter ein Account,
und in meinem Program sehe ich nur 5, und genau der Account fehlt. So,
vermutlich liegt der Fehler in meinem Code, den ich hier dann mal poste
(etwas stilisiert zwecks Lesbarkeit). Vielleicht findest Du ja etwas.
Zun�chst werden die Sessions mit Type=10 gesucht und deren Properties
aufgelistet. Anschlie�end werden alle Associators zu der jeweiligen Session
gesammelt und davon alle Properties gelistet.

Gru�,
Fritz

ConnectionOptions oConn = new ConnectionOptions();

oConn.Username = user;
oConn.Password = password;
oConn.Impersonation = ImpersonationLevel.Impersonate;
oConn.Authentication = AuthenticationLevel.PacketPrivacy;

ManagementScope oMS = new ManagementScope("\\\\" + server +
"\\root\\cimv2", oConn);

string sessionQueryString = "select * from win32_logonsession
where logontype = 10";

ManagementObjectSearcher oSearcher = new
ManagementObjectSearcher(oMS, new SelectQuery(sessionQueryString));
foreach (ManagementBaseObject oSession in oSearcher.Get())
{
string strSession = oSession["LogonId"].ToString() + "\n" +
oSession["LogonType"].ToString() + "\n";

string userquery = "associators of
{Win32_LogonSession.LogonId=\"" + oSession["LogonId"] + "\"}";

string strPProps = "Session
Properties\n--------------------------------\n";
PropertyDataCollection pCol = oSession.Properties;
foreach (PropertyData pD in pCol)
{
strPProps += pD.Name + "=>" + pD.Value + "\n";
}
MessageBox.Show(strPProps); // Displays properties of
session

RelatedObjectQuery relatedQuery = new
RelatedObjectQuery(userquery);
ManagementObjectSearcher usearcher = new
ManagementObjectSearcher(oMS, relatedQuery);
ManagementObjectCollection colAssoc = usearcher.Get();
try
{
foreach (ManagementObject mob in colAssoc)
{
try
{
PropertyDataCollection dcol = mob.Properties;
string strProps = "Associated
Properties\n--------------------------------\n";
foreach (PropertyData d in dcol)
{
strProps += d.Name + "->" + d.Value + "\n";
}
MessageBox.Show(strSession + strProps);
//Displays properties of associated class
}
catch (Exception e2)
{
MessageBox.Show("Error: " + e2.Message);
}
}
}
catch (Exception e3)
{
MessageBox.Show("Error: " + e3.Message);
}
}

"FrankDzaebel" <po...@franksseite.de> wrote in message
news:91d7e499-148b-4255...@j19g2000yqk.googlegroups.com...
Hallo Fritz,

> 1. Wenn man alle Associators der Sessions Typ 10 durchackert, hat keines
> davon Attribute FullName oder Domain. Associators der Klasse
> Win32_LoggedOnUser gibt es hier gar nicht.

Bei mir schon. [Win XP zum Beispiel].
[WMI Tools / WMI CIM Studio]
/ Win32_LogonSession -> GetInstances
/ Doppelklick auf eine Instanz
/ Registerkarte Associations /

... dann sieht man den Accountnamen, Dom�ne
und SID des Aufrufers. Das ganze wird �ber die
Win32_LoggedOnUser verkn�pft auf
Win32_Account.

Die Verkn�pfung ist hier auch dokumentiert:

Hier ggf. ein Tool, mit dem Du das schnell pr�fen kannst:

Ansonsten k�nnte auch folgender Hinweis
f�r Dich interessant sein, der hatte damals
f�r den User geklappt:

> 2. Die anderen Associators verweisen s�mtlich auf irgendwelche

Fritz Hilgemann

unread,
Dec 10, 2009, 10:12:28 AM12/10/09
to
Hallo Thomas,

Danke f�r den Tip. Hast Du dazu ein Beispiel (m�glichst C#)?
Ich bin allerdings damit auch auf Cassia gesto�en
(http://code.google.com/p/cassia/), was ein guter Wrapper daf�r ist. Leider
bekomme ich bei manchen Servern ein Access Denied und wei� noch nicht, warum
eigentlich.

Gru�,
Fritz

"Thomas Scheidegger" <spam.ne...@swissonline.ch> wrote in message
news:OOmQmRNe...@TK2MSFTNGP04.phx.gbl...

FrankDzaebel

unread,
Dec 10, 2009, 10:35:50 AM12/10/09
to
Hallo Fritz,

> Leider bekomme ich bei manchen Servern ein Access Denied [...]

Du kannst ggf. den Link aus meinem Posting ausprobieren:

[pinvoke.net: WTSEnumerateSessions (wtsapi32)]
http://www.pinvoke.net/default.aspx/wtsapi32/WTSEnumerateSessions.html

Hier kann man ggf. genauer die Fehler herausfinden,
als wenn es schon gewrappt ist.

Meiner Erfahrung nach, ist es normal, dass solche Acces denied
zum Teil auftreten, ganz unabhängig von der API - also das würde
auch bei WMI passieren können.
Das Problem ist oft, dass a) die Rechner ggf. nicht in der
Domäene sind und Authentifizierungs-Probleme entstehen,
b) ggf. ein: gpupdate / force gemacht
werden muss, wenn Du mit einem Account im AD testest, der
gerade die entsprechenden Admin-Rechte bekommen hat.

Fritz Hilgemann

unread,
Dec 11, 2009, 7:17:02 AM12/11/09
to
Hallo Frank,
sorry, den Link hatte ich falsch zugeordnet. Also das funktioniert zwar,
aber eben auch mit der Ausnahme, da� es an einigen Workstations ein Access
denied gibt. Ein Grund daf�r l��t sich nicht "herausdebuggen". Ich mu�
sowieso Impersonation einsetzen, m�glicherweise liegt auch da das Problem.
Dazu schreibe ich einen separaten Thread. gpupdate hilft auch leider nichts.
Und doch, die Rechner sind in einer Domain.
Ansonsten, auch das sei erw�hnt, bietet die WTS API genau das was ich suche,
und ist auch eine feine Sache.

Gru�,
Fritz


"FrankDzaebel" <po...@franksseite.de> wrote in message

news:b9710729-65f2-41c1...@v30g2000yqm.googlegroups.com...
Hallo Fritz,

> Leider bekomme ich bei manchen Servern ein Access Denied [...]

Du kannst ggf. den Link aus meinem Posting ausprobieren:

Hier kann man ggf. genauer die Fehler herausfinden,
als wenn es schon gewrappt ist.

Meiner Erfahrung nach, ist es normal, dass solche Acces denied

zum Teil auftreten, ganz unabh�ngig von der API - also das w�rde
auch bei WMI passieren k�nnen.


Das Problem ist oft, dass a) die Rechner ggf. nicht in der

Dom�ene sind und Authentifizierungs-Probleme entstehen,

0 new messages