Script: Netzwerkuser abmelden

  • Momentan bau ich mir ein NAS zu Hause auf und hatte das Problem, daß man sich immer von Windows abmelden muß, damit man sich als anderer User auf dem Server einloggen kann. Google hat mir dann über die Konsole 'net use' vorgeschlagen, was auch ging, aber IMO auch recht umständlich. Also überlegt wie ich das noch einfacher machen kann und hab dann mal C# angeworfen. Ok, auf eine schnelle Lösung bin ich als Nicht-Programmierer nicht gekommen und hab mir dann mit PureBasic eine Alternative gesucht. Aber auch da waren einige Ungereimheiten. Nach kurzer Überlegung hab ich mich dank c't an AutoIt erinnert und wieder Google gefragt. Ja und siehe da, ich hab jetzt mein kleines Programm, was mir auf die Schnelle die Arbeit abnimmt und den eingeloggten User wieder 'killt'. So kann ich mich recht schnell als anderer User wieder anmelden um zum Bsp. die Rechte zu überprüfen.
    Ich hab natürlich auch hier nach (Teil)Lösungen gesucht und bin auch fündig geworden. Daher stell ich mal meinen Code hier mit rein und wer will, kann mir ja noch ein paar Tipps geben, was man noch optimieren kann, oder was auf jedenfall noch mit rein muß.

    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>

    [/autoit][autoit][/autoit][autoit]

    ;Funktion von 'gtaspider' http://www.AutoIt.de
    Func check_online()
    ;By GtaSpider
    Local $stdBuffer, $sreBuffer
    $Pid = Run(@ComSpec & ' /c net view', '', @SW_HIDE, 2 + 4)
    While Not @error
    $stdBuffer &= StdoutRead($Pid)
    WEnd
    $sreBuffer = StringRegExp ($stdBuffer, "\\\\([a-zA-Z0-9-]*)", 3)
    $usre = UBound($sreBuffer)
    ReDim $sreBuffer[$usre+1]
    _ArrayPush($sreBuffer,$usre,1)
    ProcessClose($Pid)
    Return $sreBuffer
    EndFunc ;==>check_online

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ;Erstellte GUI mit Koda Form-Designer
    #Region ### START Koda GUI section ### Form=form_home.kxf
    $form_home = GUICreate("KillNetworkUser", 341, 167, -1, -1)
    GUISetIcon("icon.ico")
    $label_showMessage = GUICtrlCreateLabel("Select PC", 20, 119, 301, 20, $SS_CENTER, $WS_EX_STATICEDGE)
    GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
    GUICtrlSetColor(-1, 0x800000)
    $button_kill = GUICtrlCreateButton("Kill Now!", 182, 25, 136, 51, $WS_GROUP)
    GUICtrlSetFont(-1, 14, 800, 0, "MS Sans Serif")
    $button_exit = GUICtrlCreateButton("Exit", 252, 81, 66, 26, $WS_GROUP)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUISetState(@SW_SHOW)
    $button_info = GUICtrlCreateButton("Info", 182, 81, 66, 26, $WS_GROUP)
    $Group1 = GUICtrlCreateGroup("", 5, 1, 331, 161)
    $listbox_pc = GUICtrlCreateList("", 21, 24, 150, 84)
    #EndRegion ### END Koda GUI section ###

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $info = "KillNetworkUser " & Chr(10) & "" & Chr(10) & " by Ophthalamia"

    [/autoit][autoit][/autoit][autoit]

    ;Funktion aufrufen und Werte ins Array schreiben
    $pcs = check_online()
    For $i = 1 To $pcs[0]
    GUICtrlSetData($listbox_pc, $pcs[$i])
    Next

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ;Hauptprogramm
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

    [/autoit][autoit][/autoit][autoit]

    Case $button_info
    MsgBox(8192, "Information", $info, 10)

    [/autoit][autoit][/autoit][autoit]

    Case $button_exit
    Exit

    [/autoit][autoit][/autoit][autoit]

    Case $button_kill
    $pcname = GUICtrlRead($listbox_pc) ;übergeben ausgewählten Wert ins Listview
    $val = RunWait(@ComSpec & " /c " & "net use \\" & $pcname & " /delete", "", @SW_HIDE) ;Hide-Aufruf vom CMD mit net use ...
    ; Rückgabewert 0 = gekillt
    ; Rückgabewert 2 = nicht geloggt

    [/autoit][autoit][/autoit][autoit]

    if $pcname = "" Then ;Nichts ausgewählt
    GUICtrlSetData($label_showMessage, "No PC selected!")
    Else
    If $val = 0 Then ;Kill User
    GUICtrlSetData($label_showMessage, "User is killed from " & $pcname)
    Else ;Niemand eingeloggt
    GUICtrlSetData($label_showMessage, "Nobody is logged on " & $pcname)
    EndIf
    EndIf

    [/autoit][autoit][/autoit][autoit]

    EndSwitch
    WEnd

    [/autoit]


    Mir gefällt AutoIt bisher wirklich gut und ich werde mich auf jedenfall weiter damit beschäftigen. Auch hoffe ich, daß ich meinen Großen dafür begeistern kann und er sich 'endlich' auch mal anderen Sachen als nur spielen widmet. Er ist jetzt 12 und das ist ja schon fast zu spät dafür. ;)


    Gruss Ophthalamia

  • Dir ist denke ich aber bewusst, dass mit "net use /delete" du dich nicht von der Verbindung abmeldest sondern sie schlicht und einfach abgebrochen wird. Das ist nicht das selbe und kann unter umständen zu Datenverlust führen wenn gerade noch Daten übertragen werden.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Das ist mir nicht bewußt. Dennoch denke ich, daß es für das, was ich machen möchte ausreicht. Es geht hier wirklich nur darum, schnell den Benutzer abzumelden und sich dann mit einem anderen wieder anzumelden um div. Sachen überprüfen zu können.
    Aber welche Alternarive gibt es?


    Gruss Ophthalamia

  • Wieso blicken wieder nur 50 % das was er möchte ?
    Ich würd aber genau so wie TheShadowAE denken, auf den ersten anblick, weil er ein Tool hat wo er andere Nutzer sieht, und denen die Verbindung kappen möchte, damit es schneller als Windoof geht, wenn ich jetzt alles richtig verstanden habe.

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Wieso blicken wieder nur 50 % das was er möchte ?
    Ich würd aber genau so wie TheShadowAE denken, auf den ersten anblick, weil er ein Tool hat wo er andere Nutzer sieht, und denen die Verbindung kappen möchte, damit es schneller als Windoof geht, wenn ich jetzt alles richtig verstanden habe.

    Genau so meine ich das. Ich denke auch, daß einige hier das auch gut nachvollziehen können, daß es lästig ist, jedesmal sich selbst abzumelden um sich dann wieder in Netzwerk unter einem anderen Usernamen anzumelden.
    Also mir hilft das Script wirklich und ja, es ist mein erstes! :)


    Gruss Ophthalamia

  • Bitte benutz doch in Zukunft den Beitrag bearbeiten Button, damit keine 3fach Posts zustande kommen.
    Danke ;)

    Bearbeiten geklickt > Includes eingefügt > Absenden geklickt ...und das hab ich ja nicht 3x gemacht?! ?(

  • Doch, will ich! :)

    Du schreibst du willst die Verbindung zum NAS kappen. Verbindugn kappen != herrunterfahren. Genauso ist es etwas anderes sich vom NAS "abzumelden" wie von Windows. Ich denke du solltes dir erstmal klar werden was du willst.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Das Prob ist wohl, dass er entweder nicht weiß wie sein NAS funktioniert oder er von der administrativen Anmeldung am NAS redet, was wiederum etwas komplett anderes ist.

    Weil ein NAS ist ja gerade dafür da, dass mehrere Leute gleichzeitg darauf zugreifen.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Nochmal: Über die Windows-Netzwerkverwaltung gibt man seine im NAS abgelegten Nutzerdaten an um, auf den Server zu kommen. Will man dann aber mit, von der gleichen Windows-Maschine, einem anderen Zugang einloggen, muß man erst sein Windows neu starten oder zumindest abmelden. Da führt einfach kein anderer Weg dran vorbei, der mir bekannt ist.
    Wenn ich jetzt aber das NAS einrichte und die Benutzerrechte festlege und diese dann überprüfen möchte, ist das eben sehr umständlich und zeitraubend. Ja und dann hab ich eben 'net use \\servername /delete' entdeckt, was eben genau das macht. Den User von der Windows-Maschine am NAS abmelden. Und nur das wollte ich eben etwas komfortabler haben und versucht das in ein Programm zu packen, was mit AutoIt gut geklappt hat.

  • Und genau das mein ich, du wiedersprichst dir. Oben wir erklärt wie man remote eine anderen Rechenr runterfährt und du bist begeistert davon obwohl das überhaupt nicht das ist was du brauchst. Und was du unter Windows-Netzwerkverwaltung für Nutzerdaten angibst ist mir auch schleiferhaft. Normalerweiße gibts die IP/Netzwerkname des NAS an und kommst dann je nach Konfiguration direkt oder über Anmeldemaske auf das NAS. Sobald den Ordner dann wieder schließt und neu aufmachst musst dich weider neu beim NAS anmelden.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Ich weiß nicht, wie ich es noch erklären soll? Ich versuche es mal so... (Ich bin ja immer offen für andere Vorschläge, Tipps und Tricks.) :)

    Ich hab 'nen alten Rechner als NAS eingerichtet. Mit FreeNas. Da dies ja auf Samba basiert, habe ich da entsprechend eine Benutzerliste. Also ich gebe in FreeNas meine Benutzer mit Loginnamen und Passwort an. Mit diesen Daten können sich die Benutzer über ihre Windows-Rechner am Server anmelden. Logisch, dafür ist das ja alles da! ;)
    Ich als Admin vergebe die Rechte und möchte das auch immer gleich überprüfen, ob das auch gleich richtig von mir vergeben wurde. Ja und das mache ich ja über meinen Rechner und gebe da entsprechend die Benutzerdaten an. Dann sehe ich, ob die Rechte gegriffen haben. Wenn nicht, schau ich auf dem Server nochmal nach und korrigiere. Klappt alles, müsste ich mich jetzt von meinem Rechner abmelden um mich als ein anderer Benutzer wieder anmelden zu können. Das ist aber eben lästig und deshalb nutze ich eben den bekannten net-Befehl, der die Session löscht und man sich wieder neu anmelden muß.
    Anders kann ich es jetzt nicht mehr beschreiben, denn wie schon erwähnt, packe ich um den net-Befehl nur ein kleines Programm. Ich will auch keinen anderen Rechner runterfahren. Ich will mich nur von meinem Rechner aus mit verschiedenen Accounts auf den Server anmelden ohne meinen Rechner ständig neu zu starten.

  • Will man dann aber mit, von der gleichen Windows-Maschine, einem anderen Zugang einloggen, muß man erst sein Windows neu starten oder zumindest abmelden.


    Na ja, der von mir in einem früheren Post genannte

    [autoit]

    shutdown(0)

    [/autoit]

    würde dir zumindest das Abmelden ersparen.

    ch will mich nur von meinem Rechner aus mit verschiedenen Accounts auf den Server anmelden ohne meinen Rechner ständig neu zu starten.

    Du solltest dich in die Funktionen der WinNet.au3 einarbeiten, z.B.:

    [autoit]

    _WinNet_CancelConnection
    _WinNet_AddConnection
    _WinNet_UseConnection

    [/autoit]

    Leider existieren dafür in der Hilfe (noch) keine Beispiele und ich habe kein Netzwerk zur Verfügung um es auszutesten,

    mfg autoBert