ShutDown remoto con c#

martedì 02 marzo 2010 - 01.09

LucaRomandini Profilo | Newbie

Buona sera a tutti...come da oggetto avrei bisogno di un pezzo di codice, una indicazione o qualunque altra cosa per venire a capo di questo problema..ho provato con le WMI ed anche richiamando il comando dos(shutdown -f-s-m), ma niente da fare...Qualche suggerimento??grazie
____________
LUCA

MarKonE Profilo | Guru

Ciao Luca,

molto dipende dal sistema operativo della/e macchina/e che devi spegnere.

Qualche info in più ?

Ciaooo
My Blog... http://blogs.dotnethell.it/Mark/

LucaRomandini Profilo | Newbie

il SO delle macchine da spegnere è win xp(home ed sp3) stavo pensando di utilizzare telnet...ma come faccio ad eseguire telnet da c#?qualche esempio di codice?
____________
LUCA

disti Profilo | Newbie

Prova questo:

using System; using System.Runtime.InteropServices; namespace shutdown { class Program { [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern bool InitiateSystemShutdown( string lpMachineName, string lpMessage, uint dwTimeout, bool bForceAppsClosed, bool bRebootAfterShutdown); static void Main(string[] args) { Console.WriteLine("Premere un tasto per spegnere il pc..."); Console.Read(); InitiateSystemShutdown(@"\\127.0.0.1", "Shutdown...", 30, true, false); } } }

MarKonE Profilo | Guru

Telnet ? A che pro ?

Magari anche questa utility potrebbe esserti utile : http://technet.microsoft.com/en-us/sysinternals/bb897541.aspx

Ciao !
My Blog... http://blogs.dotnethell.it/Mark/

disti Profilo | Newbie

Attenzione: telnet non è installato in automatico su vista e 7!

Meglio una soluzione con codice proprietario come quella che ti ho postato, oppure una utility come suggerito MarKonE.

Se decidi per una utility esterna attenzione al fatto che poi per ridistribuire la tua applicazione dovresti ridistribuire anche l'utility (o chiedere agli utenti di installarla).

Questo potrebbe scontrarsi con i vincoli di licenza dell'utility, che magari non prevedono la distribuzione con altri programmi.

ciao!

LucaRomandini Profilo | Newbie

Quella di scrivere una classe da includere nella mia applicazione sarebbe la soluzione ideale...peccato che i problemi con i quali mi sono andato a scontrare sfiorano l'infinito..."Aprire" una shell da codice e passargli lo shutdown?? bene...non funziona, usare le WMI??bene...non funzionano neanche quelle...in locale tutto bene(così come con il codice che mi hai postato), ma in remoto non funziona un bel niente...sto impazzendo...comunque ho pensato a telnet perchè è l'unica cosa che da consol sembri funzionare...
____________
LUCA

LucaRomandini Profilo | Newbie

Quella di scrivere una classe da includere nella mia applicazione sarebbe la soluzione ideale...peccato che i problemi con i quali mi sono andato a scontrare sfiorano l'infinito..."Aprire" una shell da codice e passargli lo shutdown?? bene...non funziona, usare le WMI??bene...non funzionano neanche quelle...in locale tutto bene(così come con il codice che mi hai postato), ma in remoto non funziona un bel niente...sto impazzendo...comunque ho pensato a telnet perchè è l'unica cosa che da consol sembri funzionare...
____________
LUCA

LucaRomandini Profilo | Newbie

ah..ultimo aggiornamento...non funziona neanche l'utility...non so più dove sbattere la testa
____________
LUCA

disti Profilo | Newbie

Ho verificato che il codice che ho postato funziona su pc remoto con xp pro se prima lanci questo comando:

NET USE \\<ip_computer_remoto> /user:<utente_computer_remoto> <password_computer_remoto>

devo vedere come riprodurre nel codice il comando sopra...

MarKonE Profilo | Guru

E' molto strano.

Hai provato ad utilizzare direttamente questi parametri dell'utility ?

-u Specifies optional user name for login to remote computer.
-p Specifies optional password for user name. If you omit this you will be prompted to enter a hidden password.

Ciao !

My Blog... http://blogs.dotnethell.it/Mark/

LucaRomandini Profilo | Newbie

Ho provato con il net use ma niente...per quanto riguarda l'utility avevo già provato...ma non funge...non rimane che fare la porcata...creo una applicazione fantasma da istallare sul client che stà in ascolto su di una porta, quando il server manda un messaggio specifico richiama il comando shutdown...se avete idee migliori...
____________
LUCA

LucaRomandini Profilo | Newbie

Per disti...
nel caso ti interessasse il comando net use si integra in questo modo...
public void NetUse(string ip,string user,string pass) { string test1 = "NET USE \\"+ip+" /user: "user pass "; ProcessStartInfo processo = new ProcessStartInfo(); processo.CreateNoWindow = false; processo.UseShellExecute = false; processo.FileName = "cmd.exe"; processo.Arguments = "/c " + test1; try { using (Process ProcessoExe = Process.Start(processo)) { ProcessoExe.WaitForExit(); } } catch { } }



____________
LUCA

MarKonE Profilo | Guru

Personalmente utilizzerei un approccio diverso.

Partirei dal presupposto che l'utility "deve" funzionare, ed eviterei come la peste accrocchi da installare sui pc target....


Cosa vuol dire di preciso "non funziona" ? Vedi messaggi particolari ? Sul client target vedi messaggi registrati sul registro eventi ? Il pc da cui lanci l'utility fa parte di un Dominio ? E il client target ? L'utente utilizzato gode dei diritti amministrativi sulla macchina target ?

Una delle prime cose da verificare, a mio avviso, sono i permessi associati all'utente utilizzato... perchè puzza il fatto che se le credenziali utilizzate sono salvate in cache (tramite il comando net use manuale) tutto funziona.

Ciao !

My Blog... http://blogs.dotnethell.it/Mark/

disti Profilo | Newbie

Concordo con Markone, ho fatto ulteriori prove e il dutto a me funziona. Probabilmente il problema è specifico della tua configurazione.
A questo punto per provare a darti una mano ci occorrono i risultati dettagliati delle tue prove.

Oltre alle informazioni richieste da markone, che sono fondamentali (appartenenza o meno a un dominio, permessi dell'utente chiamante,...), vorrei sapere se sulla macchina da spegnere è presente un firewall e/o un antivirus e/o un antispyware.


@LucaRomandini:
Quello che intendevo è ricreare tramite codice il comando NET, proprio come il codice che ho postato "ricrea" il comando shutdown. Se possibile cerco sempre di evitare di richiamare programmi/comandi esterni. Grazie comunque per la segnalazione!

ciao!

disti Profilo | Newbie

Ho completato il mio codice inserendo anche la parte per l'autenticazione.
L'ho provato da 7 su xp e funziona. Occhio però: ho dovuto disabilitare il firewall di xp....

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

LucaRomandini Profilo | Newbie

il firewall è disabilitato, antivirus disattivato, l'utente ha i privilegi di amministratore, il computer non fa parte di un dominio, per quanto riguarda il net use funziona...nel senso che si autentifica ma quando lancio il pezzo di codice che ha postato disti niente..se ne frega...ora sono a Milano all'università...come secondo computer ho usato quello di un mio amico che era venuto a trovarmi...ora che è andato via non ho più modo di provare..sabato 13, appena torno a casa, vi farò sapere se ci sono novità...grazie a tutti e due per l'aiuto e la disponibilità :)
____________
LUCA

MarKonE Profilo | Guru

Da chiarire la questione dominio/workgroup e l'utente utilizzato per le prove.

A presto!


My Blog... http://blogs.dotnethell.it/Mark/

disti Profilo | Newbie

Sono quasi certo che il problema riguarda xp home: su quello non è possibile disattivare la condivisione file semplice, e questo da notoriamente dei problemi di autenticazione con "net use".

quando farai le prossime prove, se ti è possibile, prova a utilizzare un sistema operativo diverso!

ciao!

MarKonE Profilo | Guru

Ciao,

personalmente non considererei nemmeno l'utilizzo di Net Use.... e nemmeno accetterei di rinunciare a spegnere un xp home

Approfondiamo il discorso utenti/permessi.

CIAOOO
My Blog... http://blogs.dotnethell.it/Mark/

disti Profilo | Newbie

Il problema è che Home sembra forzare sempre l'utilizzo dell'utente guest. Su xp c'è una chiave di registro:

Chiave : HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
Valore : ForceGuest (DWORD)

che regola l'utilizzo di guest. Se questo valore è 1, ogni utente che richiede l'accesso viene "reindirizzato" su guest.

Qualche informazione su questo si trova qui:
http://technet.microsoft.com/it-it/library/bb418978.aspx (primi due paragrafi)

Il problema è che Home ignora completamente questa impostazione, come peraltro indicato da microsoft:

http://support.microsoft.com/kb/307874/it (nota nell'introduzione).

La vedo dura...

MarKonE Profilo | Guru

Non vedo nessuna limitazione dell'utility legata alla versione home :

Runs on:

* Client: Windows XP and higher.
* Server: Windows Server 2003 and higher.

Però sarebbe bello avere un paio di macchine su cui fare prove
My Blog... http://blogs.dotnethell.it/Mark/

disti Profilo | Newbie

Io ho effettivamente provato su una macchina XP home, e non riesco a fare il login con "NET USE" (errore 1326).
Non ho avuto tempo di provare anche l'utility sysinternals perchè nel frattempo ho restituito la macchina al cliente, ma credo che sarebbe lo stesso.

In genere quando questo accade la soluzione è appunto di disabilitare la condivisione file semplice.

ciao

LucaRomandini Profilo | Newbie

finalmente qualche buona notizia! poco fa mi ha contattato il mio amico insieme al quale stò portando avanti il programma...ha detto di essere riuscito a spegnere il computer da remoto con psshutdown...non abbiamo avuto modo di parlare molto dato che doveva correre alla stazione e tornare all'uni...comunque qualche lieve barlume di speranza sembra esserci..anche se distribuire un software che per funzionare necessita di un eseguibile esterno mi sembra poco elegante...tornando al discorso di dicsi...io il net use l'ho provato tra 7 ed xp(pro sp3) e funziona, ovvero riesce ad autenticarsi...quello che non va è lo spegnimento..col psshut, invece, sembra funzionare...ora il problema è come integrarlo nella mia applicazione...
____________
LUCA

Anonimo Profilo | Senior Member

scusa, con shutdown . hai sbagliato sinstassi.
si fa cosi:

shutdown /r /m \\NomeComputer

-->Nome computer e il tuo nome del pc.

se devi spengera atrli computer devi andare sulle propietà del computer,
impostazioni avanzate->Connessione Remota->E mettera la spunta -Su Consenti connessione remota.

e cosi ti funziona

Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5