PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : VB: Pc über Netzwerk


aVenger
2004-07-16, 10:26:26
Wie kann ich per VB einen anderen PC im Netzwerk heruntfahren lassen oder neustarten usw.?
Ich brauche sicher auch ein Client und ein Servertool oder?

Blumentopf
2004-07-16, 10:58:29
Hier ein Server Beispiel:

'server
Option Explicit

Private mlngConnections As Long

Private Sub cmdSend_Click()
On Error GoTo ErrHandler
If lstClients.ListIndex > -1 Then
' Index des betroffenen Steuerelements ermitteln, damit an den
' richtigen, in der Liste ausgewählten Client gesendet wird.
Dim lngIndex As Long
lngIndex = lstClients.ItemData(lstClients.ListIndex)
wskServer(lngIndex).SendData txtSend.Text
Else
MsgBox "Wählen Sie vor dem Senden einen Client in der Liste aus.", vbInformation
End If
Exit Sub
ErrHandler:
MsgBox Err.Description, vbCritical
End Sub

Private Sub Form_Load()
' Die erste Instanz des Steuerelements ist nur zum Warten
' auf Verbindungsanforderungen da und wird entsprechend initialisiert
wskServer(0).LocalPort = 1001 ' Das Control hört auf den Port 1001
wskServer(0).Protocol = sckTCPProtocol ' Verbindung über TCP
wskServer(0).Listen
sbr.SimpleText = "Listening ..."
End Sub

Private Sub wskServer_Close(Index As Integer)
' Verbindung wird geschlossen, also das dynamisch angelegt Steuerelement
' wieder entladen
Unload wskServer(Index)
' Info aus der Liste entfernen
Dim i As Integer
For i = 0 To lstClients.ListCount - 1
If lstClients.ItemData(i) = Index Then
lstClients.RemoveItem i
Exit For
End If
Next
End Sub

Private Sub wskServer_ConnectionRequest(Index As Integer, ByVal requestID As Long)
On Error GoTo ErrHandler
mlngConnections = mlngConnections + 1

' Neue Instanz des Steuerelements für die Verbindung erzeugen
Load wskServer(mlngConnections)

With wskServer(mlngConnections)
' Anforderung auf Verbindung annehmen
.Accept requestID

' Infos in der Listbox ausgeben (.RemoteHost liefert leider immer "" (???))
lstClients.AddItem .RemoteHost & " " & .RemoteHostIP & ":" & .RemotePort & " / " & .SocketHandle
' In ItemData den Index des Steuerelements merken, damit
' dieser später zum Senden und Entfernen verwendet werden kann
lstClients.ItemData(lstClients.NewIndex) = mlngConnections
End With

Exit Sub
ErrHandler:
MsgBox Err.Description, vbCritical
End Sub

Private Sub wskServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)
On Error GoTo ErrHandler
' Daten angekommen
Dim strData As String
wskServer(Index).GetData strData, vbString

With wskServer(Index)
txtData.Text = "Daten von Client " & .RemoteHostIP & _
":" & .RemotePort & ", SocketHandle: " & .SocketHandle & _
": " & strData
End With

Exit Sub
ErrHandler:
MsgBox Err.Description, vbCritical
End Sub

Private Sub wskServer_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
sbr.SimpleText = "Fehler " & Number & " in der Quelle " & Source & " aufgetreten: " & Description
End Sub

Private Sub wskServer_SendComplete(Index As Integer)
sbr.SimpleText = "Daten erfolgreich übermittelt"
End Sub

Private Sub wskServer_SendProgress(Index As Integer, ByVal bytesSent As Long, ByVal bytesRemaining As Long)
sbr.SimpleText = bytesSent & " Bytes gesendet"
End Sub


Hier der dazugehörige client:



'client
Option Explicit

Private Sub cmdSend_Click()
On Error GoTo ErrHandler
wskClient.SendData txtSend.Text
Exit Sub
ErrHandler:
MsgBox Err.Description, vbCritical
End Sub

Private Sub cmdStart_Click()
On Error GoTo ErrHandler
If cmdStart.Caption = "Verbindung aufbauen" Then
wskClient.RemoteHost = txtRemoteHost.Text
wskClient.RemotePort = txtRemotePort.Text
' Verbindung anfordern
wskClient.Connect
sbr.SimpleText = "Versuche, die Verbindung aufzubauen ..."
cmdStart.Enabled = False
Else
cmdStart.Caption = "Verbindung aufbauen"
cmdSend.Enabled = False
wskClient.Close
sbr.SimpleText = "Verbindung geschlossen"
End If
Exit Sub
ErrHandler:
MsgBox Err.Description, vbCritical
End Sub

Private Sub Form_Load()
sbr.SimpleText = "Verbindung geschlossen"
End Sub

Private Sub wskClient_Connect()
cmdSend.Enabled = True
cmdStart.Enabled = True
cmdStart.Caption = "Verbindung schließen"
sbr.SimpleText = "Verbindung aufgebaut"
End Sub

Private Sub wskClient_DataArrival(ByVal bytesTotal As Long)
' Daten angekommen
Dim strData As String
wskClient.GetData strData, vbString
txtData.Text = strData

End Sub

Private Sub wskClient_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
sbr.SimpleText = "Fehler " & Number & " in der Quelle " & Source & " aufgetreten: " & Description
End Sub


Das mit dem Runterfahren schau ich noch: Ist aber nicht so schwer. So ziemlich alles was du über VB brauchst findest du hier: www.planet-source-code.com.

Crushinator
2004-07-16, 11:20:56
Es geht auch mit der Shutdown.exe, welche bei XP-Proff bereits dabei ist, und notfalls (auch für Win2000 bzw. NT) aus dem NT 4.0 Ressourcekit (http://www.microsoft.com/ntserver/nts/downloads/recommended/ntkit/default.asp) entnommen werden kann.

Aus dem VB-Code wird's dann so aufgerufen:


' Für das Ding aus dem Reskit
Call Shell("shutdown.exe \\Computername /T:0 /C /Y", vbHide)
' Vorsicht, der /C Parameter bewirkt, daß
' offene Anwendungen notfalls gewaltsam beendet werden.
' shutdown.exe führt eine Operation auf dem Zielrechner
' aus, die dort Administratorrechte bzw. Rechte zum
' Herunterfahren voraussetzt. Also, darauf achten, daß
' der angemeldete User auf dem Rechner, wo shutdown.exe
' ausgeführt wird entsprechende Rechte auf dem
' Zielrechner besitzt.


' und für jenes, das bei XP dabei ist
Call Shell("shutdown.exe -m \\Computername -T 0 -f", vbHide)
' Parameter -f gleicht dem obigen /C und die
' Rechte müssen eben so vorhanden sein.
Setzt allerdings voraus, daß der Zielrechner unter mindestens NT läuft.

aVenger
2004-07-16, 11:41:12
Original geschrieben von Crushinator
Es geht auch mit der Shutdown.exe, welche bei XP-Proff bereits dabei ist, und notfalls (auch für Win2000 bzw. NT) aus dem NT 4.0 Ressourcekit (http://www.microsoft.com/ntserver/nts/downloads/recommended/ntkit/default.asp) entnommen werden kann.

Aus dem VB-Code wird's dann so aufgerufen:


' Für das Ding aus dem Reskit
Call Shell("shutdown.exe \\Computername /T:0 /C /Y", vbHide)
' Vorsicht, der /C Parameter bewirkt, daß
' offene Anwendungen notfalls gewaltsam beendet werden.
' shutdown.exe führt eine Operation auf dem Zielrechner
' aus, die dort Administratorrechte bzw. Rechte zum
' Herunterfahren voraussetzt. Also, darauf achten, daß
' der angemeldete User auf dem Rechner, wo shutdown.exe
' ausgeführt wird entsprechende Rechte auf dem
' Zielrechner besitzt.


' und für jenes, das bei XP dabei ist
Call Shell("shutdown.exe -m \\Computername -T 0 -f", vbHide)
' Parameter -f gleicht dem obigen /C und die
' Rechte müssen eben so vorhanden sein.
Setzt allerdings voraus, daß der Zielrechner unter mindestens NT läuft.


Ich habe selbst ein Proggy mit dem ich einiges steuern kann(u.a. Herunterfahren mit shutdown).
Brauche ich wenn ich irgend einen PC im Netz herunterfahren will nur die Zeile
Call Shell("shutdown.exe -m \\Computername -T 0 -f", vbHide)
oder brauch ich auch auf dem Server den ich herunterfahren möchte irgend ein Tool??

Crushinator
2004-07-16, 12:02:18
Nein, Du brauchst dafür kein Extra-Tool mehr auf dem Zielrechner. Es basiert auf herkömmlicher Win32 RPC-Kommunikation. :)

aVenger
2004-07-16, 12:15:34
THX

Ich hätte noch eine Frage wenn LW öffnen
Ich habe eigens programmierte Funktionen zum öffnen/schliessen eines beliebigen LW (funktioniert lokal)
weiss aber nicht wie ich es übers netz steuern soll oder das gleiche mit Fast user switch, scrennsaver activate.

Bin zurzeit nicht zu Hause (bei der Arbeit) werde es aber später posten so gegen 16:00

Crushinator
2004-07-16, 12:43:32
Habe ich das jetzt richtig verstanden, daß es um öffnen/Schließen eines CD/DVD-Laufwerkes geht? Wenn ja, würde ich eine Client/Server-Applikation für sauberer halten.

aVenger
2004-07-16, 12:55:14
so wie oben einfach mit \\Name geht das sicher nicht würde ich einmla denken oder?

Crushinator
2004-07-16, 13:18:00
Das hast Du richtig erraten, denn es handelt sich dabei um eine lokale Geräte-/Treiber-spezifische Operation, wofür es keine allgemeinen, zumindest keine dokumentierten, RPC-Aufrufe gibt. ;(

aVenger
2004-07-16, 16:26:38
Das ganze mit dem Shutdown sieht jetzt so aus

Private Sub Command2_Click()
Call Shell("shutdown.exe -m \\Avengerpc -T 0 -f", vbHide)
'Call Shell("shutdown.exe -m \\Avengerpc -r -t 00", vbHide)
End Sub

Am PC der Heruntergefahren werden soll hab ich gar nichts geändert. Aber es funkt. nicht

edit: Auf beiden Rechnern ist WXP Prof. SP2 installed

Crushinator
2004-07-16, 16:43:49
:gruebel: Einfach mal "cmd.exe" aufrufen und folgendes ausführen lassen, bitte. Mich würde die Ausgabe interessieren.

shutdown.exe -m \\Avengerpc -T 0 -f

aVenger
2004-07-16, 16:52:42
Private Sub Form_Load()
Call Shell("shutdown.exe -m \\Avengerpc -T 0 -f", vbHide)

End Sub

Es passiert nichts wenn ich es so schreibe

aVenger
2004-07-16, 17:10:53
Habe nun folgendes mit der Eingabeauforderung versucht hat aber auch nicht funkt.

C:\Dokumente und Einstellungen\Avenger>shutdown.exe -r -m \\avengerpc
Zugriff verweigert

Crushinator
2004-07-16, 17:19:55
Da haben wir den Fehlerteufel. :D Der angemeldete User auf dem Rechner, der "shutdown.exe" ausführt, hat keine administrativen Rechte auf dem runterzufahrenden Rechner, was er - wie ich bereits in meinem ersten Posting in diesem Thread schrieb - haben muß. ;)

aVenger
2004-07-16, 20:57:57
Das weiss ich auch dank dieser MSG
wie genau gebe ich einem Benutzer im Netzwerk alle Rechte???
edit: War nur komisches Deutsch zuerst:D

Sephiroth
2004-07-17, 16:49:44
[t_as]Avenger im Win-Forum hättest du ruhig mal einen verweis hierher machen können ...

so wird nen Schuh draus(jedenfalls in VBS).

VBS

DIM WSHShell
SET WSHShell = WScript.CreateObject("WScript.Shell")
wshshell.run "shutdown -s -f -m \\REMOTEPC -t 0"

P.S.
Ja was denn nun, VB oder VBScript?

P.P.S.
Aufgrund der einem Mledung von oben, sollte es so gehen.


Private Sub Command2_Click()
Call Shell("%comspec% /c shutdown.exe -s -f -m \\Avengerpc -t 0", vbHide)
End Sub

aVenger
2004-07-18, 15:58:55
Original geschrieben von Sephirot

Private Sub Command2_Click()
Call Shell("%comspec% /c shutdown.exe -s -f -m \\Avengerpc -t 0", vbHide)
End Sub

Es wird immer ein FEHLER angezeigt bei dieser Variante.

Kinman
2004-07-18, 21:30:08
mit xp antispy den remotecontroller deaktiviert?
Außerdem, was fragst net mi, i hab das proggy eh schon mal gschrieben ;)

mfg Kinman

aVenger
2004-07-19, 09:58:49
Original geschrieben von Kinman
mit xp antispy den remotecontroller deaktiviert?
Außerdem, was fragst net mi, i hab das proggy eh schon mal gschrieben ;)

mfg Kinman
Die Remoteeinstellungen passen (bin ja kein Noob)
Bei deinem Programm benötigt der Server ein Programm zum ausschalten und der CLient muss auch ein Programm laufen haben.

Crushinator
2004-07-19, 10:44:45
Original geschrieben von [t_as]Avenger
(...) wie genau gebe ich einem Benutzer im Netzwerk alle Rechte??? (...) Der Benutzer (mit Admin-Rechten) muß auf beiden PCs mit identischem Kennwort existieren, und in "lokale Sicherheitsrechtlinien" unter "Sicherheitsoptionen" die Option "Netzwerkzugriff: Die Verwendung von Jeder..." so einstellen wie bei mir im Bild (Deaktiviert) und falls das nicht bereits ausreicht, die andere von mir markierte und zus. mit mit Pfeil gekennzeichnete Option auf "klassische..." umstellen. :)

P.S.: Am einfachsten ist es mit den Admin-Rechten, wenn der Benutzer auf beiden Rechnern zur Administratorengruppe hinzugefügt würde. (Obiges muß man trotzdem machen, wenn beide oder nur einer der Rechner keiner Domäne angehört)

aVenger
2004-07-19, 12:19:14
Ich versteh jetzt nicht ganz wie du das meinst deshalb erkläre ich hier wie es bei mir aussieht.

PC1: Username:User
PW:12345
PC2: Username:User
PW:12345

Jeder dieser User ist auf dem "eignen" PC Admin. Auf dem anderen wurde nichts geändert.

Crushinator
2004-07-19, 12:35:04
OK, das ist schonmal in Ordnung. Wenn Du jetzt noch unter "Systemsteuerung->Verwaltung->lokale Sicherheitsrechtlinie" dann "lokale Richtlinien" aufklappen und darunter "Sicherheitsoptionen" o.ä. auswählen würdest, könntest Du die von mir geposteten Optionen noch kontrollieren und ggf. umstellen. Danach sollte es meiner Meinung nach keine "Zugriff verweigert" Meldungen mehr geben.

Kinman
2004-07-19, 20:45:13
Original geschrieben von [t_as]Avenger
Ich versteh jetzt nicht ganz wie du das meinst deshalb erkläre ich hier wie es bei mir aussieht.

PC1: Username:User
PW:12345
PC2: Username:User
PW:12345

Jeder dieser User ist auf dem "eignen" PC Admin. Auf dem anderen wurde nichts geändert.

aber du bist jo kein noob.. na scherz beiseite.
Sag mal was genau du machen willst. wenn du nur das ausschalten fernsteuern willst is das jo kein problem, aber sobald du mehr machen willst (CD-LW, Musik an/aus, etc.) brauchst a client/server version. Und vor allem is a client/server implementation sauberer.

Von mir aus kannst de Netzwerkkommunikation von mir haben und zusätzlich a modul mit sämtlichen sachen die man so brauchen kann. Den rest solltest dann selbst schaffen. Ansonsten schau mal bei http://www.vbarchiv.net vorbei

Offtopic: Vllt kannst du am Mittwoch zu mir kommen, wegs Clanwar

mfg Kinman