2010-09-13 5 views
0

I ont une fonction:PowerShell Socket objet différent si elle est créée par la fonction, par rapport à la CLI

function QuerySMTPServer ([string]$strSMTPServerName) { 
    # open up a socket to the SMTP server 
    $socket = New-Object System.Net.Sockets.TCPClient 
    $socket.connect($strSMTPServerName, 25) 
    $socket # output for testing 

    # read response data (should be a line starting with 220; cf. RFC821) 
    $stream = $socket.getStream() 
    $stream # output for testing 
    ... 

Si je lance la fonction et le transmettre notre (bien configuré et en fonctionnement) adresse du serveur SMTP, le $ socket et des objets de flux $ qui sont délivrés en sortie me dire que j'ai 0 octets disponibles sur la prise, et aucune donnée disponible sur le flux:

PS C:\Users\dan.maftei\Documents> QuerySMTPServer "internal-smtp.XYZ.com" 

($socket) 
Client    : System.Net.Sockets.Socket 
Available   : 0 
Connected   : True 
... 
($stream) 
DataAvailable : False 

Cependant, il y a en effet des données disponibles, puisque je peux créer un tableau d'octets et lisez dedans avec la méthode read() de l'objet $ stream. En fait, c'est exactement ce que je fais dans le reste de la fonction, et tout fonctionne sans erreur. (!)

Si je saisis manuellement dans l'exécutable PowerShell exactement les mêmes applets de commande ma fonction appelle, mon socket $ subitement (et à juste titre) prétend qu'il a 79 octets de données, et mon $ stream dit également qu'il a données disponibles:

PS C:\Users\dan.maftei\Documents> $socket = New-Object System.Net.Sockets.TCPClient 

PS C:\Users\dan.maftei\Documents> $socket.connect("internal-smtp.XYZ.com", 25) 

PS C:\Users\dan.maftei\Documents> $socket 

Client    : System.Net.Sockets.Socket 
Available   : 79 
Connected   : True 

PS C:\Users\dan.maftei\Documents> $stream = $socket.getStream() 

PS C:\Users\dan.maftei\Documents> $stream 

... 
DataAvailable : True 
... 

Que se passe-t-il ?? Pourquoi est-ce que j'obtiens des objets différents si j'exécute ces très peu de cmdlets via la CLI plutôt que via la fonction? Pourquoi puis-je encore lire les données de mon $ stream même si apparemment il n'en a pas selon la sortie dans la fonction?

Répondre

Questions connexes