1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

CMD - Herunterfahren (u.Ä.) über LAN

Discussion in 'Programmieren' started by Final Griever, Oct 14, 2008.

Thread Status:
Not open for further replies.
  1. Hallo!
    Momentan programmiere ich ein Tool mit Visual Basics 2008, welches mir erlaubt, im LAN verbundene PCs herunterzufahren, neuzustarten, abzumelden (nach Zeit).

    Ich selbst bin dabei der Administrator, die Anderen normale Benutzer.

    Der CMD-Code (aufgerufen durch Shell("XXX") ) lautet bisher so:
    „shutdown -s -t " + [ZEIT], " -m \\" + [BENUTZERNAME])“
    Also basierend auf „shutdown -s -t 200 -m \\MAX-PC“.

    Nur leider funktioniert das nicht… ich habe auch schon länger ge:google:t (wodurch ich schlussendlich hier gelandet bin ^^), aber nichts Vernünftiges gefunden.
    Und ich suche KEINE anderen Tools, die mir das erlauben… ich möchte das schon selbst machen! ;)

    PS: Als Admin hab ich selbstverständlich auch die Passwörter.
     
  2. kazhar

    kazhar Viertel Gigabyte

    wenn du das programm schon selber schreibst; warum verwendest du die shutdown.exe? nimm doch gleich die zuständige api funktion InitiateSystemShutdown

    allerdings solltest du sicherheitshalber vorher per AdjustTokenPrivileges das recht anfordern, computer herunter zu fahren.
     
  3. Danke schonmal für die Antwort!
    Aber… wie fahre ich denn damit 'n PC über LAN herunter?

    Und WIE binde ich das Ganze in VB.net ein?
     
  4. kazhar

    kazhar Viertel Gigabyte

    @1 indem du einen computernamen übergibst:
    InitiateSystemShutdown(<computername>, <shutdown meldung>, <sekunden warten>, <erzwungen: true/false>, <neustart: true/false>);

    @2 keine ahnung. vb kann ich nicht. gibts keine msdn referenz für vb.net mehr?
     
  5. Nein… Leider nicht, bzw. seh ich nix.
    Also… InitiateSystemShutdown gibt's bei mir nicht, der will, dass ich das deklariere…
    aber die Lösung über cmd würde mir eigentlich schon reichen.
    Wie sähe denn da der Weg aus, bzw. kennst du andere Wege?
    Viele Wege führen nach Rom.
     
  6. kazhar

    kazhar Viertel Gigabyte

    ich weis nicht woran es bei der shutdown.exe-lösung genau krankt...

    ich selber verwende eine .bat die so aussieht:
    Code:
    @echo off
    
    if %2.==. (
       set user=Administrator
    ) else (
       set user=%2
    )
    
    if %3.==. (
       set pass=*
    ) else (
       set pass=%3
    )
    
    net use \\%1\ipc$ %pass% /user:%user%
    
    shutdown -s -m \\%1 -t 60
    
    net use \\%1\ipc$ /DELETE
    verwendet wird die so
    remoteshut <computername> <optional benutzer> <optional passwort>
     
  7. Ups, hab grad erst Seite 2 gesehen…
    Na ja… damit kann ich leider nicht so viel anfangen… wie gesagt, kann NUR VB (und HTML) *schäm, es aber auf sein 15-jähriges Alter als Ausflucht zurückweis*

    Der Befehl ist ja so… shutdown -s -t 200 -m \\MAX-PC .
    Es kann aber auch sein, dass der PC doch sein eigener Admin ist.
    Dann müsste ich doch noch irgendwo Passwort und UserName mit eingeben… (nach \\ kommt doch, so denke ich, die MAC-Adresse)

    Kennst du dafür den Befehl? :)
     
  8. kazhar

    kazhar Viertel Gigabyte

    naja, wenn du es ganz ohne username und passwort versuchst kann es ja nicht gehen, wenn der benutzer den du grade verwendest auf dem anderen pc nicht in genau der selben form existiert :D

    mit mac adresse hat das nach \\ genau garnix zu tun. dabei handelt es sich um den computernamen so wie er in z.b. der netzwerkumgebung aufscheint.

    du musst zuerst mit username und passwort auf den anderen pc zugreifen - nennen wir ihn mal pc1. das geht mit dem net use - befehl

    net use \\pc1\ipc$ passwort /user:benutzername

    erst dann kannst du im 2. schritt den befehl zum abschalten absetzen

    shutdown -s -m \\pc1 -t 60

    wenn dus ganz genau machen willst kannst du dann mit dem 2. net use - befehl die verbindung wieder abbrechen
     
  9. Danke!
    Das ist, was ich brauche!
    Aber hab noch Fragen:
    Wie weiß ich genau, wie „PC1“ heißt?

    Ist das die Hostadresse, d.h. bei mir z.B. localhost ?
    Und bei anderen zum Beispiel MAX-MUSTERMANN-PC ?

    Ähm… kannst du mir erklären, was \ipc$ bringt?^^''

    Noch eine Frage ;)
    Sind dafür Adminrechte überhaupt noch nötig, wenn man Benutzername und PW hat?
    Nicht, dass dann auf einmal alle normalen User sich gegenseitig die PCs runterfahren ^^
     
    Last edited: Oct 14, 2008
  10. kazhar

    kazhar Viertel Gigabyte

    pc1 ist wie ich schon geschrieben habe der computername. den findest du z.b. in der netzwerkumgebung. localhost ist IMMER der aktuelle pc;
    du kannst aber auch die ip verwenden, wenn das praktischer ist.

    ipc$ ist die interprozesskommunikationsschnittstelle, über die der shutdown-befehl läuft.

    adminrechte sind nicht nötig. der verwendete benutzer muss aber das recht haben, den pc herunter zu fahren (also so ziemlich alle außer "gast")
     
  11. Hallo!
    Ich habe in den letzten Tagen ein programm entworfen, mit dessen Hilfe man den PC einfach herunterfahren, neustarten und abmelden kann, sowie auch Rechner im LAN.

    Jetzt gibt es aber ein Problem, wenn ich meinen eigenen PC herunterfahren will- hier einmal der Code (für jenen Buttonclick):

    PHP:
      Stunden TextBox1.Text
                Minuten 
    TextBox2.Text
                Sekunden 
    TextBox3.Text
                Zeit 
    Stunden 3600 Minuten 60 Sekunden
                
    '''''' Zeit-Initialisierung-Für Unwandlung in Sekundenda„-'''''

                Try

                Catch ex As Exception  ''''Ausnahme, da er sonst einen "Intervall muss größer als 0 sein"-Fehler macht


                    Timer1.Interval = Zeit * 0.02
                    Timer1.Start()
                End Try'

    Shell("C:\WINDOWS\system32\cmd.exe /c shutdown -s -m \\" TextBox4.Text "-t" Zeit)  '''' Normalfallkein LAN
    Er sagt beim Shell immer „Ungültige Konvertierung von der Zeichenfolge C:\WINDOWS\system32\cmd.exe /c s in Typ Double.“ - InvalidCastException wurde nicht behandelt.



    Hier noch einmal das ganze Programm, falls das nicht reicht…

    PHP:
    Public Class Form1

        
    Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgsHandles MyBase.Load
            ToolTip1
    .SetToolTip(Button2"Bricht den ausgewählten Vorgang ab.")
            
    ToolTip1.SetToolTip(TextBox1"Legt die Zeit in Stunden|Minuten|Sekunden fest.")
            
    ToolTip1.SetToolTip(TextBox2"Legt die Zeit in Stunden|Minuten|Sekunden fest.")
            
    ToolTip1.SetToolTip(TextBox3"Legt die Zeit in Stunden|Minuten|Sekunden fest.")
            
    ToolTip1.SetToolTip(CheckBox1"Führt ausgewählten Vorgang auf einen im Local Area Network definierten Rechner aus, alle Angaben werden benötigt.")
            
    ToolTip1.SetToolTip(TextBox4"Bezeichnet den PC-Namen, auf welchem der Vorgang ausgeführt werden soll.")
            
    ToolTip1.SetToolTip(TextBox5"Das dem PC-Namen zugewiesene Benutzerkonto.")
            
    ToolTip1.SetToolTip(TextBox6"Das dem Benutzerkonto zugewiesene Passwort.")
            
    ToolTip1.SetToolTip(RadioButton1"Fährt den ausgewählten Computer am Ende der vorgegebenen Zeit herunter.")
            
    ToolTip1.SetToolTip(RadioButton2"Fährt den ausgewählten Computer am Ende der vorgegebenen Zeit herunter und startet ihn danach wieder neu (ohne Datenspeicherung).")
            
    ToolTip1.SetToolTip(RadioButton3"Meldet den ausgewählten Computer am Ende der vorgegebenen Zeit ab und erzwingt Beendigung aller Prozesse und Anwendungen.")
            
    ToolTip1.SetToolTip(ProgressBar1"Stellt die Füllung der Bar proportional zur ausgewählten Zeit dar.")
            Try
                
    Dim arrArgs() As String Command.Split(",")
                
    TextBox4.Text arrArgs(0)
                If 
    TextBox4.Text "" Then
                    TextBox4
    .Text Environ("COMPUTERNAME")
                
    End If
            Catch 
    ex As Exception
                TextBox4
    .Text Environ("COMPUTERNAME")
            
    End Try
        
    End Sub

        
    Private Sub RadioButton1_CheckedChanged(ByVal sender As System.ObjectByVal e As System.EventArgsHandles RadioButton1.CheckedChanged

        End Sub

        
    Private Sub RadioButton2_CheckedChanged(ByVal sender As System.ObjectByVal e As System.EventArgsHandles RadioButton2.CheckedChanged

        End Sub

        
    Private Sub GroupBox1_Enter(ByVal sender As System.ObjectByVal e As System.EventArgsHandles GroupBox1.Enter

        End Sub

        
    Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgsHandles Button1.Click
            Button2
    .Enabled True
            Dim Stunden 
    As Integer
            Dim Minuten 
    As Integer
            Dim Sekunden 
    As Integer
            Dim Zeit 
    As Double
            
    '--------RadioButton1-----'
            
    If RadioButton1.Checked True Then
                Stunden 
    TextBox1.Text
                Minuten 
    TextBox2.Text
                Sekunden 
    TextBox3.Text
                Zeit 
    Stunden 3600 Minuten 60 Sekunden
                
    '''''' Zeit-Initialisierung|Wandelt alles in Sekunden um''''''

                
    Try

                Catch 
    ex As Exception  ''''Ausnahmeda er sonst einen "Intervall muss größer als 0 sein"-Fehler macht


                    Timer1
    .Interval Zeit 0.02
                    Timer1
    .Start()
                
    End Try


                
    Dim ZeitSTR As Short
                ZeitSTR 
    Zeit

                Dim ZeitInt 
    As Integer Math.Round(Zeit)


                If 
    CheckBox1.Checked True Then  ''''Wenn es über LAN funktionieren soll
                    Shell
    ("C:\WINDOWS\system32\cmd.exe /c net use \\" TextBox4.Text "\ipc$" TextBox6.Text "/user:" TextBox5.Text)
                    
    Shell("C:\WINDOWS\system32\cmd.exe /c shutdown -s -m \\" TextBox4.Text "-t" ZeitSTR)
                Else

                    
    'Try

                    '
    Catch ex As Exception

                    Shell
    ("C:\WINDOWS\system32\cmd.exe /c shutdown -s -m \\" TextBox4.Text "-t" Zeit)  '''' Normalfallkein LAN
                    
    'End Try

                    Button1.Enabled = False
                End If
            End If
            '
    -------------RadioButton2-----------------'
            If RadioButton2.Checked = True Then
                Stunden = TextBox1.Text
                Minuten = TextBox2.Text
                Sekunden = TextBox3.Text
                Zeit = Stunden * 3600 + Minuten * 60 + Sekunden ''''' 
    Zeit-Init''''

                
    Try

                Catch 
    ex As Exception


                    Timer1
    .Interval Zeit 0.02  ''' Wie oben
                    Timer1.Start()
                End Try

                Dim ZeitSTR As String
                ZeitSTR = Zeit
                If CheckBox1.Checked Then ''' 
    LAN-Fall

                    Shell
    ("C:\WINDOWS\system32\cmd.exe /c net use \\" TextBox4.Text "\ipc$" TextBox6.Text "/user:" TextBox5.Text)
                    
    Shell("C:\WINDOWS\system32\cmd.exe /c shutdown -r -m \\" TextBox4.Text "-t" ZeitSTR)
                Else
                    Try
                    Catch 
    ex As Exception  ''''Normalfall
                        Shell
    ("C:\WINDOWS\system32\cmd.exe /c shutdown -r -m \\" TextBox4.Text "-t" ZeitSTR)
                    
    End Try
                
    End If


                
    Button1.Enabled False
            End 
    If
            
    '--------RadioButton3-----------'
            
    If RadioButton3.Checked True Then
                Stunden 
    TextBox1.Text
                Minuten 
    TextBox2.Text
                Sekunden 
    TextBox3.Text
                Zeit 
    Stunden 3600 Minuten 60 Sekunden

                Timer1
    .Interval Zeit 0.02
                Timer1
    .Start()




                
    Button1.Enabled False
            End 
    If

        
    End Sub

        
    Private Sub Timer1_Tick(ByVal sender As System.ObjectByVal e As System.EventArgsHandles Timer1.Tick
            ProgressBar1
    .Increment(+5)
            If 
    RadioButton3.Checked True Then
                
    If ProgressBar1.Value 100 Then
                    
    If CheckBox1.Checked Then
                        Shell
    ("C:\WINDOWS\system32\cmd.exe /c net use \\" TextBox4.Text "\ipc$" TextBox6.Text "/user:" TextBox5.Text)
                        
    Shell("C:\WINDOWS\system32\cmd.exe /c shutdown -l -m \\" TextBox4.Text)
                        
    Timer1.Stop()
                    Else
                        
    Shell("C:\WINDOWS\system32\cmd.exe /C shutdown -l")
                    
    End If
                
    End If
                
    End If
        
    End Sub

        
    Private Sub CheckBox1_CheckedChanged(ByVal sender As System.ObjectByVal e As System.EventArgs)
            If 
    CheckBox1.Checked True Then
                Environ
    ("COMPUTERNAME")
            
    End If
        
    End Sub

        
    Private Sub CheckBox1_CheckedChanged_1(ByVal sender As System.ObjectByVal e As System.EventArgsHandles CheckBox1.CheckedChanged
            
    If CheckBox1.Checked True Then
                TextBox4
    .Enabled True
                TextBox5
    .Enabled True
                TextBox6
    .Enabled True
            
    Else
                
    TextBox4.Enabled False
                TextBox5
    .Enabled False
                TextBox6
    .Enabled False
                TextBox5
    .Text "Benutzername"
                
    TextBox6.Text "Passwort"

            
    End If
        
    End Sub

        
    Private Sub TextBox5_MouseClick(ByVal sender As System.ObjectByVal e As System.Windows.Forms.MouseEventArgsHandles TextBox5.MouseClick
            TextBox5
    .Text ""
        
    End Sub

        
    Private Sub TextBox6_MouseClick(ByVal sender As System.ObjectByVal e As System.Windows.Forms.MouseEventArgsHandles TextBox6.MouseClick
            TextBox6
    .Text ""
        
    End Sub

        
    Private Sub TextBox3_TextChanged(ByVal sender As System.ObjectByVal e As System.EventArgsHandles TextBox3.TextChanged
            
    Try
                
    Dim i As Integer TextBox3.Text
                
    If 60 Then
                    TextBox3
    .Text "00"
                
    End If
            Catch 
    ex As Exception

            End 
    Try
        
    End Sub
        
    Private Sub TextBox4_TextChanged(ByVal sender As System.ObjectByVal e As System.EventArgsHandles TextBox3.TextChanged
            
    Try
                
    Dim i As Integer TextBox3.Text
                
    If 60 Then
                    TextBox3
    .Text "00"
                
    End If
            Catch 
    ex As Exception

            End 
    Try
        
    End Sub

        
    Private Sub TextBox3_MouseClick(ByVal sender As System.ObjectByVal e As System.Windows.Forms.MouseEventArgsHandles TextBox3.MouseClick
            TextBox3
    .Text ""
            
    If TextBox1.Text "" Then
                TextBox1
    .Text "00"
            
    End If
            If 
    TextBox2.Text "" Then
                TextBox2
    .Text "00"
            
    End If
        
    End Sub

        
    Private Sub TextBox2_MouseClick_1(ByVal sender As System.ObjectByVal e As System.Windows.Forms.MouseEventArgsHandles TextBox2.MouseClick
            TextBox2
    .Text ""
            
    If TextBox3.Text "" Then
                TextBox3
    .Text "00"
            
    End If
            If 
    TextBox1.Text "" Then
                TextBox1
    .Text "0"
            
    End If
        
    End Sub



        
    Private Sub TextBox2_TextChanged(ByVal sender As System.ObjectByVal e As System.EventArgsHandles TextBox2.TextChanged

        End Sub

        
    Private Sub TextBox1_MouseClick(ByVal sender As System.ObjectByVal e As System.Windows.Forms.MouseEventArgsHandles TextBox1.MouseClick
            TextBox1
    .Text ""
            
    If TextBox2.Text "" Then
                TextBox2
    .Text "00"
            
    End If
            If 
    TextBox3.Text "" Then
                TextBox3
    .Text "0"
            
    End If
        
    End Sub

        
    Private Sub Button2_Click(ByVal sender As System.ObjectByVal e As System.EventArgsHandles Button2.Click
            Timer1
    .Stop()
            
    ProgressBar1.Value 0
            Shell
    ("C:\WINDOWS\system32\cmd.exe /C shutdown -a")
            
    MsgBox("Der Vorgang wurde abgebrochen.")
            
    Button2.Enabled False
            Button1
    .Enabled True
        End Sub

        
    Private Sub Label1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs)

        
    End Sub
    End 
    Class
    Es geht halt beim Herunterfahren nicht… obwohl der Befehl doch eigentlich korrekt (?) ist.
    Er führt quasi „shutdown -s -m \\MEINNAME-PC -t 500“ aus.

    Auf Wunsch kann ich das Programm auch uploaden o.Ä. !

    Danke im Vorraus, der auf eure Hilfe bauende Final Griever
     
  12. kazhar

    kazhar Viertel Gigabyte

    punkt 1: warum bemühst du denn die cmd.exe? shutdown ist kein shell-befehl sondern genau wie cmd ein programm.

    punkt 2: ich schätze mal dass die die "zeit" den fehler reinhaut. mach die mal versuchsweise raus (bzw. zu "60" oder so

    edit: warum ein neuer thread?
     
  13. Hnas2

    Hnas2 Ganzes Gigabyte

    :schieb:
    Threads zur gleichen Frage zusammengeführt.
     
  14. 1: Wie (vielleicht) schon gesagt… bin „erst“ 15 und habe vor gut einer Woche mit VB angefangen… wusste nicht, wie ich es sonst machen sollte, und von den Befehlen des Linkes auf der ersten Seite, den du mir geschickt hast, habe ich keinerlei Ahnung.
    Und da ich mir sonst nicht zu helfen wusste…
    (kann ich auch alternativ „Console.“ nehmen?)

    Aber wenn ich die zeit ändere, bringt es auch nichts.
    Außerdem habe ich jetzt noch erfahren, dass man Strings nicht mit „+“ sondern mit „&“ addiert, und den Try-Befehl gerichtet.
    Sieht jetzt so aus:

    PHP:
    Try
                        
    Shell("C:\WINDOWS\system32\cmd.exe /c shutdown -s -m \\" TextBox4.Text "-t" Zeit)  '''' Normalfallkein LAN
                    
    Catch ex As Exception
                        MsgBox
    ("FEHLER")
                    
    End Try
    Aber trotzdem funktioniert es nicht… also, es wird kein Error oder das Fenster angezeigt, aber er fährt auch nicht herunter.
     
Thread Status:
Not open for further replies.

Share This Page