Eine user session eindeutig identifizieren
-
Hi,
ich suche nach der besten Möglichkeit eine (möglicherweise nicht mehr aktive) user session innerhalb eines Netzwerkes zu identifizieren. Das Ganze soll sowohl von Windows 2000 an aufwärts laufen als auch unter Linux/Posix. Dabei dürfen nur Standardfunktionen verwendet werden und es muss bereits im User-mode laufen.
Hier meine aktuelle Idee:
1. PC im Netzwerk identifizieren über domain und host name
Posix: getdomainname() + gethostname()
Win32: GetComputerNameEx(ComputerNameDnsFullyQualified)2. User session auf dem aktuellen Rechner finden
Posix: getsid(0)
Win32: ??? ProcessIdToSessionId() liefert keine brauchbare ID (gibt aktuelle session nummer beginnend mit 1 heraus).
GetUserName() ist wohl besser als nichts, aber eigentlich brauche ich ein "getsid(0)" für Win32.Seht ihr Probleme, bzw. könnt die Lücken im Ansatz füllen?
MfG, ZenJu
PS: Wozu das Ganze? Die zugrundeliegende Anforderung ist es, bei vorgegebener process id zu entscheiden, ob der zugehörige Prozess gerade irgendwo im Netzwerk noch läuft. Das kann man natürlich nur lokal überprüfen, also wenn die process id zur user session des eigenen Rechners gehört.
PPS: Indirekte Netzwerkzugriffe über Ws2_32 will ich vermeiden.
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Die Anforderung lässt sich noch kürzer formulieren:
Welche Daten brauche ich, um die auf meinem Rechner aktuell laufende Session eindeutig innerhalb eines Netzwerkes zu identifizieren. Letztlich brauche ich nur folgende Funktion:
bool thisIsTheSessionIAmCurrentlyRunning(SomeSessionIdentifier);
Was ist "SomeSessionIdentifier"?
-
Nach langem Suchen habe ich eine Lösung gefunden, wie man die session id unter Win32 ermittelt: http://msdn.microsoft.com/en-us/library/windows/desktop/aa446670(v=vs.85).aspx
Läuft ab XP, auf Windows 2000 laut MS Doku offiziell nicht, was nichts heißen muss. Admin Rechnte werden offenbar auch nicht benötigt. Hier der nur noch ein drittel so lange C++ code:
HANDLE hToken = 0; if (!::OpenProcessToken(::GetCurrentProcess(), //__in HANDLE ProcessHandle, TOKEN_ALL_ACCESS, //__in DWORD DesiredAccess, &hToken)) //__out PHANDLE TokenHandle throw FileError(L""); ZEN_ON_SCOPE_EXIT(::CloseHandle(hToken)); DWORD bufferSize = 0; ::GetTokenInformation(hToken, TokenGroups, nullptr, 0, &bufferSize); std::vector<char> buffer(bufferSize); if (!::GetTokenInformation(hToken, //__in HANDLE TokenHandle, TokenGroups, //__in TOKEN_INFORMATION_CLASS TokenInformationClass, &buffer[0], //__out_opt LPVOID TokenInformation, bufferSize, //__in DWORD TokenInformationLength, &bufferSize)) //__out PDWORD ReturnLength throw FileError(L""); auto groups = reinterpret_cast<const TOKEN_GROUPS*>(&buffer[0]); for (DWORD i = 0; i < groups->GroupCount; ++i) if ((groups->Groups[i].Attributes & SE_GROUP_LOGON_ID) != 0) { LPTSTR sidStr = nullptr; if (!::ConvertSidToStringSid(groups->Groups[i].Sid, //__in PSID Sid, &sidStr)) //__out LPTSTR *StringSid throw FileError(L""); ZEN_ON_SCOPE_EXIT(::LocalFree(sidStr)); wxMessageBox(sidStr); }
-
Dann habe ich eigentlich nur noch eine Frage:
In der Dokumentation von "GetComputerNameEx" mit Parameter "ComputerNameDnsFullyQualified" (http://msdn.microsoft.com/en-us/library/windows/desktop/ms724301(v=vs.85).aspx) heißt es, dass der Computer eindeutig identifizert wird.
Der Methodenaufruf gibt bei mir "Zenju-PC" zurück. Sieht für mich nicht gerade eindeutig aus. Was hindert andere Netzwerkteilnehmer daran, ihren host genauso zu nennen?
-
If the local computer is not configured to use DNS names, GetComputerNameEx will not return DNS information.
Sehr geil, wieder eine function, die nicht tut was sie verspricht.
-
Sehr geil, wieder eine function, die nicht tut was sie verspricht.
wie kommst du auf die idee?
vorallem wenn die fnkt einem parameter braucht der ComputerNameDnsFullyQualified heißt.
-
Das soll diese Funktion tun:
Retrieves a NetBIOS or DNS name associated with the local computer. The names are established at system startup, when the system reads them from the registry.
Warum tut die Funktion nicht das was sie verspricht?
Verstehst Du kein Englisch?