Page 1 sur 1

Commande Runas refuse d'arrêter le spooler

Posté : dim. 13 déc. 2020 17:35
par NicoB
Bonjour à tous,
J'ai déjà utilisé avec succès la commande RunAs mais là, je sèche complétement.
Je veux qu'un simple utilisateur puisse effacer tous les travaux d'impression "bloqués" sur une machine.
Je pensais m'en sortir très facilement avec la ligne de commande ci-dessous, mais rien n'y fait !
RunAs("Nom_admin", @ComputerName, "Mot_de_passe", 0, @ComSpec & " /c net stop spooler&del C:\Windows\System32\spool\printers\* /Q /F /S&net start spooler&pause", "", @SW_SHOW)
Dans la console j'obtiens le message suivant :
"L'erreur système 5 s'est produite. Accès refusé", comme si je n'avais pas les droits administrateur.
Je précise que je connais le nom et le mot de passe du compte Admin de la machine
Après de nombreux tests et essais, impossible de comprendre et de trouver une solution.
Que faut-il faire ?
Je vous remercie par avance.
Cordialement

Re: Commande Runas refuse d'arrêter le spooler

Posté : lun. 14 déc. 2020 15:03
par Nine
As-tu essayer #RequireAdmin ?

Re: Commande Runas refuse d'arrêter le spooler

Posté : mar. 15 déc. 2020 21:31
par NicoB
Bonjour,

Tout d'abord merci Nine pour votre réponse.
Si j'ajoute #RequireAdmin dans le script principal, cela ne me convient pas car le mot de passe Administrateur est demandé au lancement du script, ce que je veux justement éviter.
J'ai creusé mon problème de mon coté et trouvé la parade suivante : Un script secondaire qui contient le #RequireAdmin et la commande net stop spooler... que j'appelle via un RunAs dans un script principal.
Cette solution fonctionne bien mais je ne trouve pas cela très "propre"

Script principal :
#include <AutoItConstants.au3>
FileInstall (".\Reset_Spooler.exe", @AppDataCommonDir&"\Reset_Spooler.exe")
$variable1="Compte_Admin"
$variable2="Mot_de_passe_Admin"
RunAs($variable1, @ComputerName, $variable2, 0, @AppDataCommonDir&"\Reset_Spooler.exe", "", @SW_HIDE)
qui appelle le script secondaire complié en Reset_Spooler.exe
#RequireAdmin
Run (@ComSpec & " /c net stop spooler&del %systemroot%\System32\spool\printers\* /Q /F /S&net start spooler&pause","",@SW_SHOW)

Avez-vous une meilleure alternative ? A défaut, je considèrerai mon problème comme résolu...

D'avance Merci

Re: Commande Runas refuse d'arrêter le spooler

Posté : jeu. 17 déc. 2020 18:39
par Nine
Une autre approche (celle que je préconise) est de créer le second script à la volée :

Code : Tout sélectionner

#include <File.au3>

Local $sScript = _
  '#NoTrayIcon' & @CRLF & _
  '#RequireAdmin' & @CRLF & _
  'Run("RegEdit")' & @CRLF & _
  'FileDelete (@ScriptFullPath)'
$sFileName = _TempFile(@ScriptDir, "~", ".au3")
FileWrite($sFileName, $sScript)
RunAs ("Admin", @ComputerName, "pw", 1, @AutoItExe & ' /AutoIt3ExecuteScript "' & $sFileName & '"')
ConsoleWrite ($sFileName & @CRLF)
De cette façon, il n'y a qu'un seul script à gérer...

Re: Commande Runas refuse d'arrêter le spooler

Posté : jeu. 17 déc. 2020 23:50
par jguinch
Autre possibilité, en exécutant le script lui-même avec un argument + Shellexecute



If IsAdmin() Then
   _StopService()
ElseIf Not $CmdLine[0] Then
   _FonctionUser()
ElseIf $CmdLine[1] = "-RunAs" Then
   _ElevateMySelf()
EndIf

Func _ElevateMySelf()
   ShellExecute(@ScriptFullPath, "", @WorkingDir, "RunAs")
EndFunc

Func _FonctionUser()
   Local $admin = "administrateur"
   Local $password = InputBox("Authentification", "Entrer le mot de passe pour " & $admin & ":", "", "*")
   RunAs($admin, @ComputerName, $password, 1, @ScriptFullPath & " -RunAs", @WorkingDir)
EndFunc

Func _StopService()
   Local $oShell = ObjCreate("shell.application")
   If Not IsObj($oShell) Then Return
   $oShell.ServiceStop("spooler", False)
   MsgBox(0, "", "Service Stopped")
EndFunc

Re: Commande Runas refuse d'arrêter le spooler

Posté : dim. 20 déc. 2020 09:35
par NicoB
Merci Nine et Jguinch vos retours.
Je vais tester tout ça !
Passez de bonnes fêtes !

Re: Commande Runas refuse d'arrêter le spooler

Posté : dim. 20 déc. 2020 13:29
par jguinch
Pour le code proposé par Nine, ne pas oublier #pragma compile(AutoItExecuteAllowed, True) pour la compilation