IP Adresse ermitteln

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
Mawilo
User
Beiträge: 448
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Donnerstag 11. März 2010, 13:47

Hallo,

gibt es eine Möglichkeit, über den Benutzernamen die IP-Adresse eines Users im Netzwerk zu ermitteln (natürlich nur, wenn der User auch angemeldet ist)? Ich habe mir schon win32net und wmi angeschaut, aber nichts gefunden.
Kann aber auch sein, das liegt an meiner mangelnden Kenntniss über Netzwerke.

Grüße
Mawilo
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Donnerstag 11. März 2010, 13:54

Benutzername und IP-Adresse haben erstmal nichts miteinander zu tun. Willst du sehen, welche Sessions ein User am Fileserver geöffnet hat oder was willst du herausfinden?
Benutzeravatar
Mawilo
User
Beiträge: 448
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Donnerstag 11. März 2010, 14:24

Irgendwo muss es einen Zusammenhang geben. Früher konnte ich an einen Benutzernamen ein Popup schicken. Da musste der Benutzername doch auch aufgelöst werden.
Heute sind wir mit Vista "gesegnet" und da gibt es nur einen Dienst "msg". Das funktioniert aber nicht, wenn ich nur den Benutzernamen habe.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Donnerstag 11. März 2010, 15:24

OK, es handelt sich um ein Windows-Umfeld. Dann hat ja jeder User ein Homeverzeichnis. Wenn du rausfindest, auf welchem Server ein User sein Home hat, kannst du etwas in der Art machen:

Code: Alles auswählen

import sys
import active_directory as ad
import win32net
import pywintypes

def main(user_name):
    user = ad.find_user(user_name)
    computer_name = user.homeDirectory
    info_level = 1  # Level 2 just displays some unnecessary info about client OS.
    client_name = ""
    user_name = str(user.sAMAccountName)
    try:
        sessions = \
        win32net.NetSessionEnum(
          info_level,
          computer_name,
          client_name,
          user_name
        )
    except pywintypes.error, ext_error:
        if ext_error[0] == 2221:
            print "Es bestehen keine offenen Verbindungen."
        else:
            raise
    else:
        for session in sessions:
            # client_name returns hostname or IPv4!
            print session['client_name']
            print session['num_opens']
            # etc.

if __name__ == '__main__':
    main(sys.argv[-1])

    except pywintypes.error, ext_error:
        if ext_error[0] == 2221:
            print "Es bestehen keine offenen Verbindungen."
        else:
            raise
    else:
        for session in sessions:
            print session['client_name']
            print session['num_opens']
Das Modul active_directory finde ich einfach genial.
Falls Distributed File System (DFS) eingesetzt wird, kann man auf diese Weise leider nicht den Homepfad ermitteln. Ich behelfe mir damit, dass ich mir die Daten geben lasse, wie die Homes im System angelegt werden und werte diese aus.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Donnerstag 11. März 2010, 21:00

mkesper hat geschrieben:

Code: Alles auswählen

        sessions = \ 
        win32net.NetSessionEnum( 
          info_level, 
          computer_name, 
          client_name, 
          user_name 
        ) 
Warum nicht

Code: Alles auswählen

sessions = win32net.NetSessionEnum(
    ...
)
:?:
Benutzeravatar
Mawilo
User
Beiträge: 448
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Freitag 12. März 2010, 08:29

Da ich den Server nicht kenne, auf dem der User angemeldet ist, kann ich win32net.NetSessionEnum nicht verwenden. Außerdem benötigt man dafür auch Admin-Rechte. Jedenfalls bekomme ich eine Meldung "Zugriff verweigert", wenn ich als normaler User auf meinen eigenen Rechner zugreife.

Gibt es irgendeine Möglichkeit, über WINS den Namen aufzulösen?
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Freitag 12. März 2010, 14:23

derdon hat geschrieben:Warum nicht

Code: Alles auswählen

sessions = win32net.NetSessionEnum(
    ...
)
:?:
Sorry, war alter Code, den ich nur minimal angepasst hatte. Die ganze Stelle könnte man eleganter formulieren.

@Mawilo: Ohne Admin-Rechte wirst du hier meiner Vermutung nach nichts reißen können. Den Server, auf dem das Home des Users liegt, bekommst du ja aus dem ADS.
Benutzeravatar
Mawilo
User
Beiträge: 448
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Dienstag 16. März 2010, 09:28

Ich habe hier einen anderen Ansatz gefunden. Nach der kurzen Beschreibung sollte das Programm genau das machen, was ich suche. Allerdings kann ich mit der Ausgabe nichts anfangen. Entweder bekomme ich einen Fehler oder meinen eigenen Hostnamen.

Hat jemand noch ne Idee?
Antworten