Accueil > > > MODULE COMPLET D'ARRÊT MACHINE À DISTANCE
MODULE COMPLET D'ARRÊT MACHINE À DISTANCE
Information sur la source
Description
En recherchant sur ce site et d'autres des sources pour à partir des API win32 arrêter une machine à distance, on trouve bcp de choses, mais souvent incomplet, ou ne permettant pas d'avoir le message d'erreur si l'appel de la fonction n'a pas aboutie. (Ou uniquement compatible vb6 mais pas vb.net). On peut faire ca via la fonction shutdown.exe qui utilise la meme API et qui n'est pas dispo sur 2k/nt et ne permet pas d'avoir le code d'erreur de retour facilement. J'avais besoin de faire ca en dotnet quelque soit l'os, et j'ai donc fait un petit module permettant de le faire via une fonction avec un retour d'erreur si l'appel n'a pas abouti. Ce module est facilement incorporable dans une assembly dll par exemple histoire d'avoir une classe propre qui fasse tout ca proprement sans devoir forcement se poser la question avant de l'utiliser. Pour Info, je recupere l'éventuel message d'erreur via marshal (system.interop), et je le traite via formatmessageA. (le declare le configure automatiquement, on peut aussi passer par un DLLImport avec getlasterror a true si on veut se separer de la visual basic compatibility (qui est inclu par defaut dans un nvo projet form dotnet 2003) et eviter ainsi d'utiliser un declare) Le point d'entre de ce module (fonction friend) c'est UNE SEULE fonction qui permet à elle seule d'arrêter une machine, d'interrompre l'arrêt, de préciser le message, de forcer ou non la fermeture des appli, et le reboot après shutdown de la machine. La seule chose qui manque c'est la recupération des privileges, personnellement je le fais via un shell "net use \\machine\ipc$ /user:user pass" avant d'excuter ma fonction. En espérant que ca puisse aider.
Source
- Option Strict On
- Option Explicit On
-
- Module modAdvapi32
-
- 'Constantes nécessaire au fonctionnement des fonctions de codes non managées
- 'pour formatMessage
- Private Const FORMAT_MESSAGE_ALLOCATE_BUFFER As Short = &H100
- Private Const FORMAT_MESSAGE_IGNORE_INSERTS As Short = &H200
- Private Const FORMAT_MESSAGE_FROM_STRING As Short = &H400
- Private Const FORMAT_MESSAGE_FROM_HMODULE As Short = &H800
- Private Const FORMAT_MESSAGE_FROM_SYSTEM As Short = &H1000
- Private Const FORMAT_MESSAGE_ARGUMENT_ARRAY As Short = &H2000
- Private Const FORMAT_MESSAGE_MAX_WIDTH_MASK As Short = &HFF
-
- 'pour le language des messages d'erreurs
- Private Const LANG_NEUTRAL As Short = &H0
- Private Const SUBLANG_DEFAULT As Short = &H1
- Private Const LANG_FRENCH As Short = &HC
- Private Const SUBLANG_FRENCH As Short = &H1
-
- 'inclut les fonctions necessaires à l'arrêt de la machine
- ' on aurai pu passer par System.Runtime.InteropServices et DLLImport en mettant l'attribut setlasterror a true (comme en c#), mais en vb powa, il existe
- ' une fonction declare et elle le fait automatiquement et l'on pourra recuperer le message d'erreur via marshal getlastwin32error
- Private Declare Function InitiateSystemShutdown Lib "advapi32.dll" Alias "InitiateSystemShutdownA" (ByVal lpMachineName As String, ByVal lpMessage As String, ByVal dwTimeout As Integer, ByVal bForceAppsClosed As Integer, ByVal bRebootAfterShutdown As Integer) As Integer
- Private Declare Function AbortSystemShutdown Lib "advapi32.dll" Alias "AbortSystemShutdownA" (ByVal lpMachineName As String) As Integer
-
- 'non utilisé dans le module mais par extension pour evolutions futures
- Private Function MAKELANGID(ByRef p As Object, ByRef s As Object) As Integer
- 'MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
- Return CInt((CInt(s) * 4) Or CInt(p))
- End Function
-
- 'inclut les fonctions necessaires à la récupération des messages d'erreur si une fonction win32 n'a pas aboutie
- Private Declare Function FormatMessageA Lib "kernel32" (ByVal dwFlags As Integer, ByRef lpSource As Object, ByVal dwMessageId As Integer, ByVal dwLanguageId As Integer, ByVal lpBuffer As String, ByVal nSize As Integer, ByRef Arguments As Integer) As Integer
-
- 'surcharge de formatmessage a la sauce vb
- Private Function FormatMessage(ByVal dwMessageId As Integer) As String
- 'On est obligé de passer par une variable qui sera "remplie" par la fonction win32, c'est après coup que la fonction renvoi le nombre de caracteres reellement utilise et qu'on pourra
- ' donc réajuster la taille de celle ci (999 est suffisant, vis a vis de ce qu'on peut trouver comme message d'erreur des API win32 (http://www.xs4all.nl/~rjg70/vbapi/ref/other/errorcodes.html)
- Dim buffer As String = Space(999)
- Dim realSize As Integer = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, 0, dwMessageId, LANG_NEUTRAL, buffer, 999, 0)
- buffer = Mid(buffer, 1, realSize)
- Return buffer
- End Function
-
- Friend Function MOD_remoteSystemShutdown(ByVal BoolAbortSystemShutdown As Boolean, ByVal IPaddress As String, Optional ByVal Message As String = "", Optional ByVal TimeOutInSecond As Integer = 0, Optional ByVal BoolForceAppsClosed As Boolean = True, Optional ByVal BoolRebootAfterShutdown As Boolean = False) As String
- 'si AbortSystemShutdown=false, alors on envoi une init d'un system shutdown, les params par defaut sont arret immediat, sans message user, avec forcage fermeture appli et arret de la machine sans reboot
- 'si AbortSystemShutdown=true, alors on envoi une annulation de la commande d'init d'un system shutdown, les autres parametres ne sont pas pris en compte
-
- Select Case BoolAbortSystemShutdown
- Case True
- 'si la demande se passe bien on renvois "True" que le user de la fonction pourra facilement convertir en boolean
- 'si la demande n'a pas aboutie, on renvois une chaine de caractere contenant le texte d'erreur dans la langue par defaut de la machine sur lequel on execute cette fonction
- ' (le user pourra try un cbool(return fonction) et en cas d'erreur traiter le message d'erreur comme bon lui semble)
- If AbortSystemShutdown(IPaddress) = 0 Then
- 'une erreur s'est produite, on la recupere, on la met en forme et on la renvoi
- Return FormatMessage(System.Runtime.InteropServices.Marshal.GetLastWin32Error())
- Else
- Return "True"
- End If
- Case False
- 'si la demande se passe bien on renvois "True" que le user de la fonction pourra facilement convertir en boolean
- 'si la demande n'a pas aboutie, on renvois une chaine de caractere contenant le texte d'erreur dans la langue par defaut de la machine sur lequel on execute cette fonction
- ' (le user pourra try un cbool(return fonction) et en cas d'erreur traiter le message d'erreur comme bon lui semble)
- If InitiateSystemShutdown(IPaddress, Message, TimeOutInSecond, CInt(BoolForceAppsClosed), CInt(BoolRebootAfterShutdown)) = 0 Then
- 'une erreur s'est produite, on la recupere, on la met en forme et on la renvoi
- Return FormatMessage(System.Runtime.InteropServices.Marshal.GetLastWin32Error())
- Else
- Return "True"
- End If
- End Select
- End Function
-
- End Module
Option Strict On
Option Explicit On
Module modAdvapi32
'Constantes nécessaire au fonctionnement des fonctions de codes non managées
'pour formatMessage
Private Const FORMAT_MESSAGE_ALLOCATE_BUFFER As Short = &H100
Private Const FORMAT_MESSAGE_IGNORE_INSERTS As Short = &H200
Private Const FORMAT_MESSAGE_FROM_STRING As Short = &H400
Private Const FORMAT_MESSAGE_FROM_HMODULE As Short = &H800
Private Const FORMAT_MESSAGE_FROM_SYSTEM As Short = &H1000
Private Const FORMAT_MESSAGE_ARGUMENT_ARRAY As Short = &H2000
Private Const FORMAT_MESSAGE_MAX_WIDTH_MASK As Short = &HFF
'pour le language des messages d'erreurs
Private Const LANG_NEUTRAL As Short = &H0
Private Const SUBLANG_DEFAULT As Short = &H1
Private Const LANG_FRENCH As Short = &HC
Private Const SUBLANG_FRENCH As Short = &H1
'inclut les fonctions necessaires à l'arrêt de la machine
' on aurai pu passer par System.Runtime.InteropServices et DLLImport en mettant l'attribut setlasterror a true (comme en c#), mais en vb powa, il existe
' une fonction declare et elle le fait automatiquement et l'on pourra recuperer le message d'erreur via marshal getlastwin32error
Private Declare Function InitiateSystemShutdown Lib "advapi32.dll" Alias "InitiateSystemShutdownA" (ByVal lpMachineName As String, ByVal lpMessage As String, ByVal dwTimeout As Integer, ByVal bForceAppsClosed As Integer, ByVal bRebootAfterShutdown As Integer) As Integer
Private Declare Function AbortSystemShutdown Lib "advapi32.dll" Alias "AbortSystemShutdownA" (ByVal lpMachineName As String) As Integer
'non utilisé dans le module mais par extension pour evolutions futures
Private Function MAKELANGID(ByRef p As Object, ByRef s As Object) As Integer
'MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
Return CInt((CInt(s) * 4) Or CInt(p))
End Function
'inclut les fonctions necessaires à la récupération des messages d'erreur si une fonction win32 n'a pas aboutie
Private Declare Function FormatMessageA Lib "kernel32" (ByVal dwFlags As Integer, ByRef lpSource As Object, ByVal dwMessageId As Integer, ByVal dwLanguageId As Integer, ByVal lpBuffer As String, ByVal nSize As Integer, ByRef Arguments As Integer) As Integer
'surcharge de formatmessage a la sauce vb
Private Function FormatMessage(ByVal dwMessageId As Integer) As String
'On est obligé de passer par une variable qui sera "remplie" par la fonction win32, c'est après coup que la fonction renvoi le nombre de caracteres reellement utilise et qu'on pourra
' donc réajuster la taille de celle ci (999 est suffisant, vis a vis de ce qu'on peut trouver comme message d'erreur des API win32 (http://www.xs4all.nl/~rjg70/vbapi/ref/other/errorcodes.html)
Dim buffer As String = Space(999)
Dim realSize As Integer = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, 0, dwMessageId, LANG_NEUTRAL, buffer, 999, 0)
buffer = Mid(buffer, 1, realSize)
Return buffer
End Function
Friend Function MOD_remoteSystemShutdown(ByVal BoolAbortSystemShutdown As Boolean, ByVal IPaddress As String, Optional ByVal Message As String = "", Optional ByVal TimeOutInSecond As Integer = 0, Optional ByVal BoolForceAppsClosed As Boolean = True, Optional ByVal BoolRebootAfterShutdown As Boolean = False) As String
'si AbortSystemShutdown=false, alors on envoi une init d'un system shutdown, les params par defaut sont arret immediat, sans message user, avec forcage fermeture appli et arret de la machine sans reboot
'si AbortSystemShutdown=true, alors on envoi une annulation de la commande d'init d'un system shutdown, les autres parametres ne sont pas pris en compte
Select Case BoolAbortSystemShutdown
Case True
'si la demande se passe bien on renvois "True" que le user de la fonction pourra facilement convertir en boolean
'si la demande n'a pas aboutie, on renvois une chaine de caractere contenant le texte d'erreur dans la langue par defaut de la machine sur lequel on execute cette fonction
' (le user pourra try un cbool(return fonction) et en cas d'erreur traiter le message d'erreur comme bon lui semble)
If AbortSystemShutdown(IPaddress) = 0 Then
'une erreur s'est produite, on la recupere, on la met en forme et on la renvoi
Return FormatMessage(System.Runtime.InteropServices.Marshal.GetLastWin32Error())
Else
Return "True"
End If
Case False
'si la demande se passe bien on renvois "True" que le user de la fonction pourra facilement convertir en boolean
'si la demande n'a pas aboutie, on renvois une chaine de caractere contenant le texte d'erreur dans la langue par defaut de la machine sur lequel on execute cette fonction
' (le user pourra try un cbool(return fonction) et en cas d'erreur traiter le message d'erreur comme bon lui semble)
If InitiateSystemShutdown(IPaddress, Message, TimeOutInSecond, CInt(BoolForceAppsClosed), CInt(BoolRebootAfterShutdown)) = 0 Then
'une erreur s'est produite, on la recupere, on la met en forme et on la renvoi
Return FormatMessage(System.Runtime.InteropServices.Marshal.GetLastWin32Error())
Else
Return "True"
End If
End Select
End Function
End Module
Conclusion
bon codage :)
Historique
- 19 février 2008 17:55:55 :
- 19fév: correction de mon texte de description ou je me repetais comme un petit vieu :) (aucunes modifs du code)
- 19 février 2008 17:56:59 :
- Modifs du texte de la description où je me répètais comme un petit vieu :)
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Défilement des items d'une machine à sous! [ par Dimension X ]
Je fabrique présentement un jeu tiré du nom Anglais Slot Machine une machines à sous. Avec des timers et des cases de choix d'images, je fais changer
Arrêt d'un prog MSDos [ par Mickael ]
Voilà le topo :J'ai mon prog VB qui lance un prog MSDos par la fonction CreateProcess. Lorsque je quitte Windows 9x, et que les 2 progs tournent, il m
Arrêt d'un prog MSDos [ par Mickael ]
Voilà le topo :J'ai mon prog VB qui lance un prog MSDos par la fonction CreateProcess. Lorsque je quitte Windows 9x, et que les 2 progs tournent, il m
MAC Adresse d'un poste distant [ par Lily ]
Bonjour,Je cherche désespérément le moyen de connaître la MAC Adresse d'une machine dont on connaît l'IP ?Mon but : pinguer une machine, récupérer son
Lister tous les périph présents sur la machine [ par crazydriver ]
Salut,Je veux lister tous les périphériques d'un PC.J'en récupère dans le fichier System.ini, et dans la base de registre, mais les infos ne sont pas
WMI -- Recherche infos systeme [ par Docmail ]
Je cherche a recuperer en VB les differentes informations systeme d'une machine : Carte graphique, resolution, processeur, ram, carte reseau, mac adre
Test Réseau [ par bensniper ]
comment faire en VB pour pouvoir faire des stat sur le réseau taux d'utilisation, savoir si la machine est connecté, si il a eu des collisions,...Merc
erreur 401 automation [ par olivier ]
j'ai une application vbdevelopper sur win95 et lorsque quue j'excute l'empaquetage sur une machine equivalente il y a une erreur 401 a l'execeution de
|
Derniers Blogs
[FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson TECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PCTECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PC par ROMELARD Fabrice
Speakers: Thierry Rapatout, Antoine Petit et Xavier Trebbia Cette session entre dans le cadre des RDV Décideurs des TechDays 2012, elle est liée à la consumérisation de l'IT et la mise en place du "DeskTop as a Service" dans de plus en ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : SYSTEM CENTER SERVICE MANAGER 2012 VUE D'ENSEMBLETECHDAYS PARIS 2012 : SYSTEM CENTER SERVICE MANAGER 2012 VUE D'ENSEMBLE par ROMELARD Fabrice
Speakers: Julien Marechal, Gautier Confiant, Sébastien MEYER La session débute par le positionnement de la solution System Center par rapport aux concepts d'organisation ITIL. Le portail du catalogue de se...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : PLEINIèRE SECOND JOURTECHDAYS PARIS 2012 : PLEINIèRE SECOND JOUR par ROMELARD Fabrice
Après une première journée dédiée aux développeurs, cette seconde journée est dédiée au monde des entreprises et de ses applications. Ainsi, cette pleinière est dédiée à faire un 360 de l'évolution des applications Business aux demandes ac...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
VB6 + GRAPHVIZVB6 + GRAPHVIZ par nouirayosra
Cliquez pour lire la suite par nouirayosra
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|