2010-10-16 6 views

Répondre

0

Cela dépend de ce que vous essayez d'accomplir: ne voulez-vous voir si le serveur est opérationnel depuis votre réseau? Si oui, essayez mon Terminal Server Ping Tool. Sinon, vous pouvez seulement vérifier si quelque chose écoute sur le port 3389, par exemple avec Indy.

+0

oui, je pense que cela peut être avec indy, mais je ne sais pas comment le faire?! Si vous le savez, aidez-moi à plaider. – Behzad

+0

remko la fonction 'WinStationServerPing' semble prometteur, vous pouvez fournir un exemple de code source montrant comment l'utiliser? parce que c'est une API Windows non documentée. – RRUZ

+0

Remko sur vérifier le port 3389, n'est pas une solution très fiable, car le service Terminal Server peut être exécuté sur un autre port. – RRUZ

0

Recherchez un composant Remote Desktop pour Delphi et essayez de vous connecter.

+0

merci, mais je veux le faire par API ou le composant sont installés sur Delphi. – Behzad

4

Pour déterminer si une adresse IP est un serveur de bureau distant, vous pouvez utiliser la fonction WTSEnumerateServers.

procédez comme suit

  • énumèrent les serveurs d'un domaine de réseau en utilisant la fonction WTSEnumerateServers
  • lorsque vous obtenez la liste des serveurs convertir le nom de chaque serveur à une adresse ip
  • comparer maintenant l'adresse IP de chaque serveur avec l'ip à vérifier.

voir cet exemple, Wich montrent comment utiliser la fonction WTSEnumerateServers

uses 
    Classes, 
    Windows, 
    SysUtils; 

type 
PWTS_SERVER_INFO = ^WTS_SERVER_INFO; 
_WTS_SERVER_INFO = packed record 
pServerName:LPTSTR; 
end; 
WTS_SERVER_INFO = _WTS_SERVER_INFO; 
WTS_SERVER_INFO_Array = Array [0..0] of WTS_SERVER_INFO; 
PWTS_SERVER_INFO_Array =^WTS_SERVER_INFO_Array; 

{$IFDEF UNICODE} 
function WTSEnumerateServers(pDomainName: LPTSTR; Reserved: DWORD; Version: DWORD; ppServerInfo: PWTS_SERVER_INFO; pCount: PDWORD):BOOLEAN; stdcall; external 'wtsapi32.dll' name 'WTSEnumerateServersW'; 
{$ELSE} 
function WTSEnumerateServers(pDomainName: LPTSTR; Reserved: DWORD; Version: DWORD; ppServerInfo: PWTS_SERVER_INFO; pCount: PDWORD):BOOLEAN; stdcall; external 'wtsapi32.dll' name 'WTSEnumerateServersA'; 
{$ENDIF} 
procedure WTSFreeMemory(pMemory:Pointer);stdcall; external 'wtsapi32.dll' name 'WTSFreeMemory'; 

procedure GetRemoteDesktopsList(const Domain:PChar;const Servers:TStrings); 
var 
ppServerInfo : PWTS_SERVER_INFO_Array;//PWTS_SERVER_INFO; 
pCount  : DWORD; 
i   : integer; 
begin 
    Servers.Clear; 
    ppServerInfo:=nil; 
    try 
    if WTSEnumerateServers(Domain,0,1,PWTS_SERVER_INFO(@ppServerInfo),@pCount) then 
     for i := 0 to pCount - 1 do 
     Servers.Add(ppServerInfo^[i].pServerName) 
    else 
    Raise Exception.Create(SysErrorMessage(GetLastError)); 
    finally 
    if ppServerInfo<>nil then 
    WTSFreeMemory(ppServerInfo); 
    end; 
end; 

puis appeler comme ça

Servers:=TStringList.Create; 
    try 
    GetRemoteDesktops(nil,Servers); //using nil for the current domain. 
    //now process the list and do your stuff 

    finally 
    Servers.Free; 
    end; 
+0

merci, je pense que ce sera utile, mais je suis à la maison et je n'ai pas de vrai réseau maintenant. comment puis-je définir mon IP (127.0.0.1) dans cette fonction et obtenir des informations à ce sujet? – Behzad

+0

Cela semble être très lent. Il énumère tous les serveurs et vérifie ensuite si le serveur qu'il recherche est dans la liste. N'essayerait-on pas de s'y connecter et de gérer le succès et l'échec de manière beaucoup plus efficace? – dummzeuch

+0

RRUZ, j'ai couru votre code mais cela n'a pas fonctionné. il a un message: Le format du nom de domaine spécifié est invalide. voici le code appelant: GetRemoteDesktopsList (pchar ('192.168.10.1'), ListBox1.Items); – Behzad

Questions connexes