[2003] Servers afsluiten + VBScript

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Turdie
  • Registratie: Maart 2006
  • Laatst online: 20-08-2024
Wij moeten binnenkort onze storage gaan upgraden en daarvoor moeten we 's-nachts eerst de Windows hosts uitzetten (Windows Server 2003)
Nu heb ik een Vbscript gemaakt die dat kan, maar ik zou graag willen weten of dit script helemaal goed is of dat het nog verbeterd kan worden, en wat jullie ideeen daarover zijn.

Wat het script dus moet doen
1.Servers uit een text bestand lezen
2.Servers een shutdown commando versturen
3.Shutdown naar een logbestand schrijven


[code=vb]
'Setting Constants
Const FORCESHUTDOWN = 5
Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20
Const HKEY_LOCAL_MACHINE = &H80000002
Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8
Const Overwrite = True
'Dim variables to memory
Dim Wshshell, ObjEnv, FSO, StrTempDir, StrWinDir, StrSysDrv, ServerFileShutdownList, StrComputer
Dim LogFile



'Setting Variables
Set Wshshell = CreateObject("Wscript.Shell")
Set ObjEnv = WshShell.Environment("Process")
Set FSO = CreateObject("Scripting.FileSystemObject")
StrTempDir = objEnv("TEMP")
StrWinDir = objEnv("WINDIR")
StrSysDrv = objEnv("SystemDrive")


'Input box to enter Server Name
ServerFileShutdownList = InputBox("Enter File Path here and File Name","Datacenter Shutdown File Prompt")
If ServerFileShutdownlist <> "" Then
If FSO.FileExists(ServerFileShutdownList) Then
'Read Input File and turn lines into Variables
Set File = FSO.OpenTextFile(ServerFileShutdownList)
'Loop through Text File
Do While File.AtEndOfStream <> True
StrComputer = File.ReadLine()
' Call Shutdown Function
ServerShutdown()
Loop
Else
MsgBox "ERROR!! The File that was selected cannot be located. Please check the File location", vbCritical, "ERROR!"
'Exiting Script with Error
WScript.Quit
End If
Else
MsgBox "ERROR!! No Input File. Please Input a Server List to Shutdown.", vbCritical, "File Input Error"
'Exiting Script with Error
WScript.Quit
End If



WScript.Quit



Function ServerShutdown()


Set oWMI = GetObject("winmgmts:{impersonationLevel=impersonate,(Shutdown)}\\" & strComputer & "\root\cimv2")
Set colOperatingSystems = oWMI.ExecQuery("Select * from Win32_OperatingSystem")
For Each objOperatingSystem in colOperatingSystems
objOperatingSystem.Win32Shutdown(FORCESHUTDOWN)
If FSO.FileExists(StrSysDrv & "\LogFile.txt") Then
Set LogFile = FSO.OpenTextFile(StrSysDrv & "\LogFile.txt",ForAppending)
LogFunction()
Else
FSO.CreateTextFile(StrSysDrv & "\LogFile.txt")
Set LogFile = FSO.OpenTextFile(StrSysDrv & "\LogFile.txt",ForAppending)
LogFunction()
End If
Next



End Function



Function LogFunction()


LogFile.Write String(10,"-")
LogFile.Write VbCrLf
LogFile.Write StrComputer & " has been issued a shutdown command at " & time() & " on " & date()
LogFile.Write VbCrLf
Logfile.Close

End Function
[/code=vb]

Graag hoor ik eventuele verbeteringen of aanvullingen die ten goede komen van dit script.

Ik heb ook op het Technet Scriptcenter gekeken, maar dat staat het helaas alleen beschreven voor een server, en er wordt niks naar een logbestand geschreven.

Acties:
  • 0 Henk 'm!

  • Zwelgje
  • Registratie: November 2000
  • Laatst online: 21:44
waarom met vbs scripten als je psshutdown kan gebruiken (sysinternals/microsoft tooling) :? die kan alles wat jij wilt

A wise man's life is based around fuck you


Acties:
  • 0 Henk 'm!

  • Turdie
  • Registratie: Maart 2006
  • Laatst online: 20-08-2024
Wij hebben best hoge beveiligingseisen en mogen geen externe tools/tools die niet goedgekeurd zijn op ons netwerk gebruiken, daaronder vallen ook de tools van Sysinternals, en dit script logt wat mooier wat er gebeurt.

Ook wordt psshutdown door sommige virusscanner als risk tool gezien, en daarom automatisch van je netwerk verwijderd. Met strakke security policys is daar niet zomaar een exclusion voor geregeld.

[ Voor 51% gewijzigd door Turdie op 13-03-2009 20:30 ]


Acties:
  • 0 Henk 'm!

  • Zwelgje
  • Registratie: November 2000
  • Laatst online: 21:44
shadowman12 schreef op vrijdag 13 maart 2009 @ 20:25:
Wij hebben best hoge beveiligingseisen en mogen geen externe tools/tools die niet goedgekeurd zijn op ons netwerk gebruiken, daaronder vallen ook de tools van Sysinternals, en dit script logt wat mooier wat er gebeurt.

Ook wordt psshutdown door sommige virusscanner als risk tool gezien, en daarom automatisch van je netwerk verwijderd. Met strakke security policys is daar niet zomaar een exclusion voor geregeld.
pssshutdown is van microsoft ;)

maar goed point taken, dan houdt het op

[ Voor 3% gewijzigd door Zwelgje op 13-03-2009 20:37 ]

A wise man's life is based around fuck you


Acties:
  • 0 Henk 'm!

  • Turdie
  • Registratie: Maart 2006
  • Laatst online: 20-08-2024
Powershell schreef op vrijdag 13 maart 2009 @ 20:35:
[...]


pssshutdown is van microsoft ;)

maar goed point taken, dan houdt het op
Microsoft kan ook rotzooi maken :D. Anyway, heeft iemand anders nog nuttige ideeen?

Acties:
  • 0 Henk 'm!

  • alt-92
  • Registratie: Maart 2000
  • Niet online

alt-92

ye olde farte

Vanaf welk OS ga je dit script draaien? Beheerbak?

Enne:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Function ServerShutdown()


Set oWMI = GetObject("winmgmts:{impersonationLevel=impersonate,(Shutdown)}\\" &_
 strComputer & "\root\cimv2")
Set colOperatingSystems = oWMI.ExecQuery("Select * from Win32_OperatingSystem") 
For Each objOperatingSystem in colOperatingSystems
    objOperatingSystem.Win32Shutdown(FORCESHUTDOWN)
    If FSO.FileExists(StrSysDrv & "\LogFile.txt") Then 
     Set LogFile = FSO.OpenTextFile(StrSysDrv & "\LogFile.txt",ForAppending)
      LogFunction()
    Else 
     FSO.CreateTextFile(StrSysDrv & "\LogFile.txt")
        Set LogFile = FSO.OpenTextFile(StrSysDrv & "\LogFile.txt",ForAppending) 
        LogFunction()
   End If 
Next


End Function 


Je gaat nu pas nadat je je shutdown hebt verstuurd je logfile checken op aanwezigheid? waarom niet daarvoor een preloading routine maken met checks?

Zoals het nu is kan je potentieel een shutdown geven die nergens gelogd wordt ;)

ik heb een 864 GB floppydrive! - certified prutser - the social skills of a thermonuclear device


Acties:
  • 0 Henk 'm!

  • Turdie
  • Registratie: Maart 2006
  • Laatst online: 20-08-2024
Ja waarschijnlijk vanaf een Windows Server 2003 management server naar een aantal Windows 2003 servers.

Wat ik eigenlijk ook nog wil implementeren is dat hij 5 minuten wacht tussen elke shutdown, omdat we in het verleden wat problemen hadden met clearen van de pagefile.Hoe is dat te implenteren is dit script, een soort van timeout tussen iedere shutdown.

[ Voor 9% gewijzigd door Turdie op 14-03-2009 17:19 ]


Acties:
  • 0 Henk 'm!

  • alt-92
  • Registratie: Maart 2000
  • Niet online

alt-92

ye olde farte

Wscript.sleep? :)

Maar om nog even een paar truukjes door te geven:
Controleer met iets als
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
strPingStatus = PingStatus(strServer)
If strPingStatus = "Success" Then
    'Wscript.Echo "Success pinging " & strServer
    Call Onnet
Else
    'Wscript.Echo "Failure pinging " & strServer & ": " & strPingStatus
    Call noNet
End If
Function PingStatus(strServer)

    strLocalMachine = "."
    Set objWMIService = GetObject("winmgmts:" _
      & "{impersonationLevel=impersonate}!\\" & strLocalMachine & "\root\cimv2")
    Set colPings = objWMIService.ExecQuery _
      ("SELECT * FROM Win32_PingStatus WHERE Address = '" & strServer & "'")
    For Each objPing in colPings
        Select Case objPing.StatusCode
            Case 0 PingStatus = "Success"
            Case Else PingStatus = "Status code " & objPing.StatusCode & _
               " - Unable to determine cause of failure."
        End Select
    Next

End Function


Of je server wel bereikbaar is van tevoren.
Scheelt je weer wachttijd, en je kan de beslissing om iets te doen van de bereikbaarheid van je machines af laten hangen.

ik heb een 864 GB floppydrive! - certified prutser - the social skills of a thermonuclear device


Acties:
  • 0 Henk 'm!

  • Turdie
  • Registratie: Maart 2006
  • Laatst online: 20-08-2024
alt-92 schreef op zaterdag 14 maart 2009 @ 18:29:
Wscript.sleep? :)

Maar om nog even een paar truukjes door te geven:
Controleer met iets als
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
strPingStatus = PingStatus(strServer)
If strPingStatus = "Success" Then
    'Wscript.Echo "Success pinging " & strServer
    Call Onnet
Else
    'Wscript.Echo "Failure pinging " & strServer & ": " & strPingStatus
    Call noNet
End If
Function PingStatus(strServer)

    strLocalMachine = "."
    Set objWMIService = GetObject("winmgmts:" _
      & "{impersonationLevel=impersonate}!\\" & strLocalMachine & "\root\cimv2")
    Set colPings = objWMIService.ExecQuery _
      ("SELECT * FROM Win32_PingStatus WHERE Address = '" & strServer & "'")
    For Each objPing in colPings
        Select Case objPing.StatusCode
            Case 0 PingStatus = "Success"
            Case Else PingStatus = "Status code " & objPing.StatusCode & _
               " - Unable to determine cause of failure."
        End Select
    Next

End Function


Of je server wel bereikbaar is van tevoren.
Scheelt je weer wachttijd, en je kan de beslissing om iets te doen van de bereikbaarheid van je machines af laten hangen.
Dat is inderdaad een goeie, maar is niet per se noodzakelijk. Maar lijkt me wel handig om te doen om te controleren of de server echt down zijn.

Acties:
  • 0 Henk 'm!

  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)

Mag je zomaar alle servers wel afsluiten? Er zijn systemen (Exchange bijvoorbeeld, maar ook SQL Server) waarbij ik er zelf de voorkeur aan geef om eerst een aantal relevante services te stoppen om daarna pas de server uit te zetten.

Dat is geen aandachtspunt in deze opdracht?

Acties:
  • 0 Henk 'm!

  • Rataplan_
  • Registratie: Maart 2000
  • Laatst online: 03-09 11:31
Wat een enorm moeilijk gedoe....
ik zou het volgende doen:

servers.txt met daarin per regel een servernaam (FQDN)

shutdownservers.bat:

for /f %%G in (servers.txt) do (
shutdown /s /f /m \\%%G
if errorlevel 1 do (
echo Server %%G shutdown FAILED on %date% at %time% >>log.txt
)
else
(
echo Server %%G shutdown on %date% at %time% >>log.txt
)
)


shutdown is gewoon een INTERN commando notabene, dus dat moet 'mogen' binnen je security policy. Eventueel is dit zeer eenvoudig uit te breiden met een ping vooraf om te checken of je host uberhaubt nog op is, en naderhand ook of 'ie downgaat. Batch is zo stom nog niet :)

[ Voor 29% gewijzigd door Rataplan_ op 14-03-2009 19:42 ]


Acties:
  • 0 Henk 'm!

  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)

Sowieso heeft al jullie scripts als nadeel dat het serieel is - als het hier om tienduizenden servers gaat is je nacht al voorbij voor alles uit staat :)

Eigenlijk zou je dus een soort parallellisme moeten toevoegen om het enigszins performant te houden :)

Acties:
  • 0 Henk 'm!

  • Zwelgje
  • Registratie: November 2000
  • Laatst online: 21:44
Rataplan_ schreef op zaterdag 14 maart 2009 @ 19:38:
Wat een enorm moeilijk gedoe....
ik zou het volgende doen:

servers.txt met daarin per regel een servernaam (FQDN)

shutdownservers.bat:

for /f %%G in (servers.txt) do (
shutdown /s /f /m \\%%G
if errorlevel 1 do (
echo Server %%G shutdown FAILED on %date% at %time% >>log.txt
)
else
(
echo Server %%G shutdown on %date% at %time% >>log.txt
)
)


shutdown is gewoon een INTERN commando notabene, dus dat moet 'mogen' binnen je security policy. Eventueel is dit zeer eenvoudig uit te breiden met een ping vooraf om te checken of je host uberhaubt nog op is, en naderhand ook of 'ie downgaat. Batch is zo stom nog niet :)
intern...niet helemaal :P "copy" bv is een intern commando, shutdown is een .exe file in je system32 folder

detail :+

A wise man's life is based around fuck you


Acties:
  • 0 Henk 'm!

  • Rataplan_
  • Registratie: Maart 2000
  • Laatst online: 03-09 11:31
Powershell schreef op zaterdag 14 maart 2009 @ 19:44:
[...]


intern...niet helemaal :P "copy" bv is een intern commando, shutdown is een .exe file in je system32 folder

detail :+
je hebt helemaal gelijk, bedoelde ik eigenlijk ook O-) maar het is toch in elk geval een OS-eigen executable.

Acties:
  • 0 Henk 'm!

  • Rataplan_
  • Registratie: Maart 2000
  • Laatst online: 03-09 11:31
elevator schreef op zaterdag 14 maart 2009 @ 19:43:
Sowieso heeft al jullie scripts als nadeel dat het serieel is - als het hier om tienduizenden servers gaat is je nacht al voorbij voor alles uit staat :)

Eigenlijk zou je dus een soort parallellisme moeten toevoegen om het enigszins performant te houden :)
Dat kan je in geen enkele reguliere scripttaal doen (batch, vb, powerhell, Kix) aangezien dat allemaal 'domme' (volgens mij singlethreaded) interpreters zijn die een voor een je commando's gaan uitvoeren. Daarnaast heb je als je 10.000 servers in beheer hebt daar vast wel een mooie managementsuite omheen zoals Altiris of iets dergelijks. Maar je hebt zeker een punt, als iemand wat leuks weet voor parallel werken prove it :)

't zou in batch trouwens kunnen met het start commando, waarbij je opgeeft dat je niet wil wachten tot hij klaar is met uitvoeren daarvan, en daarmee dan een sub-script starten. Dan kan je wel meerdere batches 'tegelijk' afvuren.

Acties:
  • 0 Henk 'm!

  • Turdie
  • Registratie: Maart 2006
  • Laatst online: 20-08-2024
Rataplan_ schreef op zaterdag 14 maart 2009 @ 19:53:
[...]

Dat kan je in geen enkele reguliere scripttaal doen (batch, vb, powerhell, Kix) aangezien dat allemaal 'domme' (volgens mij singlethreaded) interpreters zijn die een voor een je commando's gaan uitvoeren. Daarnaast heb je als je 10.000 servers in beheer hebt daar vast wel een mooie managementsuite omheen zoals Altiris of iets dergelijks. Maar je hebt zeker een punt, als iemand wat leuks weet voor parallel werken prove it :)

't zou in batch trouwens kunnen met het start commando, waarbij je opgeeft dat je niet wil wachten tot hij klaar is met uitvoeren daarvan, en daarmee dan een sub-script starten. Dan kan je wel meerdere batches 'tegelijk' afvuren.
Helaas hebben wij dat soort suites niet, en moet ik dus op deze manier doen. Voor een change is dat ook beetje overdreven. En wij moeten flink besparen dus van dat soort software zal de licentie dan worden gestopt.
elevator schreef op zaterdag 14 maart 2009 @ 19:34:
Mag je zomaar alle servers wel afsluiten? Er zijn systemen (Exchange bijvoorbeeld, maar ook SQL Server) waarbij ik er zelf de voorkeur aan geef om eerst een aantal relevante services te stoppen om daarna pas de server uit te zetten.

Dat is geen aandachtspunt in deze opdracht?
Wij beheren alleen applicatieservers, en als wij daarvoor een change hebben die door door vakafdeling is approved, kunnen we gewoon onze gang gaan. SQL Servers hebben we wel en zijn bij ons in beheer en daar heb je een terecht punt.Het gaat trouwens wel om allemaal virtuele servers, ik weet niet zeker of vmWARE Tools daar al rekening mee houdt.

[ Voor 5% gewijzigd door Turdie op 14-03-2009 20:31 ]


Acties:
  • 0 Henk 'm!

  • Zwelgje
  • Registratie: November 2000
  • Laatst online: 21:44
ah Virtual Machines...

dan heb je vast wel virtualcenter en kan je daarin scheduled tasks doen (guests uitzetten) en heb je nog prima logging ook :)

http://www.vmware.com/support/vc/doc/c7powervm.html#1027779

[ Voor 4% gewijzigd door Zwelgje op 14-03-2009 20:11 ]

A wise man's life is based around fuck you


Acties:
  • 0 Henk 'm!

  • Turdie
  • Registratie: Maart 2006
  • Laatst online: 20-08-2024
Powershell schreef op zaterdag 14 maart 2009 @ 20:08:
ah Virtual Machines...

dan heb je vast wel virtualcenter en kan je daarin scheduled tasks doen (guests uitzetten) en heb je nog prima logging ook :)

http://www.vmware.com/support/vc/doc/c7powervm.html#1027779
We hebben inderdaad VirtualCenter, maar kun je daarmee ook die wachttijd van 5 minuten instellen per server?

Acties:
  • 0 Henk 'm!

  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)

Rataplan_ schreef op zaterdag 14 maart 2009 @ 19:53:
't zou in batch trouwens kunnen met het start commando, waarbij je opgeeft dat je niet wil wachten tot hij klaar is met uitvoeren daarvan, en daarmee dan een sub-script starten. Dan kan je wel meerdere batches 'tegelijk' afvuren.
Het zou inderdaad in batch moeten kunnen - ik heb ooit eens een hele stap gewaagd om zover te komen maar ben toen vastgelopen op het 'delayed expansion' verhaal van de command interpreter en het probleem dat je 'child proces' moeilijk op een nette manier kan signaleren aan je parent proces dat deze klaar is met werken.

De makkelijkste manier om het toch te doen is denk ik met textfiletjes (semaphore files :P ) die een 'busy' state aangeven om vervolgens die weer te wissen. PoCtje gemaakt:

DoRun.bat
@ECHO OFF
SET MAXCONCURRENCY=2
SET MAXWORKITEMS=5
SET SEMADIR=C:\Faq\parallel\Sema\

FOR /L %%i in (1,1,%MAXWORKITEMS%) DO (
	ECHO Busy >%SEMADIR%\%%i.busy
	START "" CMD.EXE /C CALL RunItem.bat %SEMADIR%\%%i.busy
	
	START /WAIT "" CMD.EXE /V:ON /C RunOrPause.bat %SEMADIR% %MAXCONCURRENCY%
)


RunOrPause.bat
@ECHO OFF

:LOOP
SET COUNTER=0
FOR %%i in (%1%\*.BUSY) DO (
	SET /A COUNTER=!COUNTER!+1
)

IF %COUNTER% GEQ %2 (
	ECHO Found %COUNTER% busy dirs, waiting...
	GOTO LOOP
)


Runitem.bat
ECHO "waiting..."
pause

DEL %1


Uiteraard moet - zeker die - RunOrPause.bat wat opgefrist worden want nu gaat die veel CPU tijd pakken als alle processen bezig zijn wat niet handig is, maar dan moet je iets toevoegen als sleep.exe ofzo (of een vbscriptje uitvoeren met daarin wscript.sleep :P ) en ik wou het even zo simpel mogelijk maken :)

[ Voor 11% gewijzigd door elevator op 14-03-2009 22:04 ]


Acties:
  • 0 Henk 'm!

  • Turdie
  • Registratie: Maart 2006
  • Laatst online: 20-08-2024
Maar een stomme vraag maar hoe verwerk in het bovenstaande de hele shutdown procedure en het loggen daarvan.

Wat ik er ook nog eigenlijk in zou willen verwerken is controleren door middel van een ping of de servers ook echt down zijn gegaan, maar dat is een sub-requirement en is niet strikt noodzakelijk, maar zou wel mooi zijn.

Voor het pingen heb ik zelf al deze batch file gemaakt, maar hoe ik deze ook in bovenstaande script verwerken:
@echo off
REM PINGLIST.CMD - REVISION 3
If /i "%0" == "ping" Then Goto NameError
If /i "%0" == "if" Then Goto NameError
If /i "%0" == "for" Then Goto NameError
If /i "%0" == "find" Then Goto NameError
If /i "%0" == "type" Then Goto NameError
If /i "%0" == "echo" Then Goto NameError
If /i "%0" == "set" Then Goto NameError
if "%1" == "" Goto Usage
if /i "%1" == "showresults" Goto Usage
if /i "%1" == "alive" Goto Usage
If /i "%1" == "dead" goto usage
Set systemlist=%1
if /i "%2" == "alive" Set Criteria="Reply"
if /i "%3" == "alive" Set Criteria="Reply"
if /i "%4" == "alive" Set Criteria="Reply"
if /i "%2" == "dead" Set Criteria="Request"
if /i "%3" == "dead" Set Criteria="Request"
if /i "%4" == "dead" Set Criteria="Request"
If "%criteria%" == "" Then Set Criteria="Request"
if "%2" == "" SET LogFile=%0.log
if /i "%2" == "showresults" SET LogFile=%0.log
if /i "%2" == "alive" SET LogFile=%0.log
if /i "%2" == "dead" SET LogFile=%0.log
if exist %logfile% del %logfile%
for /f "tokens=1" %%a in (%systemlist%) DO @ping -n 1 -w 100 %%a | find /i %criteria% >> %logfile%
if /i "%4" == "showresults" Type %logfile%
if /i "%3" == "showresults" Type %logfile%
if /i "%2" == "showresults" Type %logfile%
Goto End
:usage
Echo.
Echo %0 SystemList.txt [logfile.log] [showresults] [alive^|dead]
echo.
echo      Where SystemList.txt is a text file with system names or IPs, one per line.
Echo        And logfile.log is the name of the log file to record the output to.
Echo            Default log file is %0.log
Echo.
Echo        showresults tells the script to display the log file upon script completion.
Echo.
Echo.
Echo       alive tells the script to output all systems that respond to the ping request.
Echo       dead tells the script to output only the systems that do not respond to the
Echo              ping request.  dead is the default setting.
Goto End
:NameError
Echo The name of this script cannot be "PING" as the "PING" command
Echo is an integral part of the script.  It cannot be named "IF", "FOR",
Echo "SET", "ECHO", "TYPE", or "FIND" either.
:end
REM Cleanup
Set Criteria=
Set Logfile=
Set SystemList=

[ Voor 121% gewijzigd door Turdie op 14-03-2009 22:31 ]


Acties:
  • 0 Henk 'm!

  • Rataplan_
  • Registratie: Maart 2000
  • Laatst online: 03-09 11:31
elevator schreef op zaterdag 14 maart 2009 @ 22:01:
[...]

Het zou inderdaad in batch moeten kunnen - ik heb ooit eens een hele stap gewaagd om zover te komen maar ben toen vastgelopen op het 'delayed expansion' verhaal van de command interpreter en het probleem dat je 'child proces' moeilijk op een nette manier kan signaleren aan je parent proces dat deze klaar is met werken.

De makkelijkste manier om het toch te doen is denk ik met textfiletjes (semaphore files :P ) die een 'busy' state aangeven om vervolgens die weer te wissen. PoCtje gemaakt:
ik heb het wel eens gedaan door de processID te laten reporten en daar op te pollen. Pollen kost je natuurlijk echter nogal wat 'dure' cpu cycles, en daarvoor is batch niet echt geschikt denk ik. Maar ik ben nog van de ouwe stempel wat betreft scripten, kix en batch doe ik en meer niet :) VBS en Powershell vind ik verschrikkelijk... Ik kan overigens wel programmeren in objectgeorienteerde talen (maakt niet eens uit welke eigenlijk, enkel de syntax is anders) maar voor scripts: batch.

Acties:
  • 0 Henk 'm!

  • Turdie
  • Registratie: Maart 2006
  • Laatst online: 20-08-2024
Ik heb nu dit script gemaakt, met sleep vanaf robvanderwoude.com. Kan ik dat nog verbeteren, of is het zo goed. Ik ben het script nu aan het testen, en gaat hij wel erg vaak die for loop door, is daar wat aan te doen? Het parallellisme is niet nodig, om dat het toch maar om maximaal 100 servers zal gaan.
for /f %%G in (servers.txt) do (
sleep for 300
shutdown /s /f /m \\%%G
if errorlevel 1 do (
echo Server %%G shutdown FAILED on %date% at %time% >>log.txt
)
else
(
echo Server %%G shutdown on %date% at %time% >>log.txt
)
)

[ Voor 10% gewijzigd door Turdie op 15-03-2009 19:41 ]


Acties:
  • 0 Henk 'm!

  • Turdie
  • Registratie: Maart 2006
  • Laatst online: 20-08-2024
Allen,

Ik was toch niet helemaal blij met die batch-file dus daarom ben ik maar weer door gegaan op het VbScript uit begin. Ik heb daar een Wscript.Sleep in toegevoegd maar die lijkt niet helemaal lekker te gaan.Ook geeft ie foutmeldingen als een bepaalde machine niet aan staat. Hoe kan ik dat verbeteren:

[code=vb]
'Setting Constants
Const FORCESHUTDOWN = 5
Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20
Const HKEY_LOCAL_MACHINE = &H80000002
Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8
Const Overwrite = True
'Dim variables to memory
Dim Wshshell, ObjEnv, FSO, StrTempDir, StrWinDir, StrSysDrv, ServerFileShutdownList, StrComputer
Dim LogFile



'Setting Variables
Set Wshshell = CreateObject("Wscript.Shell")
Set ObjEnv = WshShell.Environment("Process")
Set FSO = CreateObject("Scripting.FileSystemObject")
StrTempDir = objEnv("TEMP")
StrWinDir = objEnv("WINDIR")
StrSysDrv = objEnv("SystemDrive")


'Input box to enter Server Name
ServerFileShutdownList = InputBox("Enter File Path here and File Name","Datacenter Shutdown File Prompt")
If ServerFileShutdownlist <> "" Then
If FSO.FileExists(ServerFileShutdownList) Then
'Read Input File and turn lines into Variables
Set File = FSO.OpenTextFile(ServerFileShutdownList)
'Loop through Text File
Do While File.AtEndOfStream <> True
StrComputer = File.ReadLine()
' Call Shutdown Function
ServerShutdown()
Loop
Else
MsgBox "ERROR!! The File that was selected cannot be located. Please check the File location", vbCritical, "ERROR!"
'Exiting Script with Error
WScript.Quit
End If
Else
MsgBox "ERROR!! No Input File. Please Input a Server List to Shutdown.", vbCritical, "File Input Error"
'Exiting Script with Error
WScript.Quit
End If



WScript.Quit



Function ServerShutdown()


Set oWMI = GetObject("winmgmts:{impersonationLevel=impersonate,(Shutdown)}\\" &_
strComputer & "\root\cimv2")
Set colOperatingSystems = oWMI.ExecQuery("Select * from Win32_OperatingSystem")
For Each objOperatingSystem in colOperatingSystems
objOperatingSystem.Win32Shutdown(FORCESHUTDOWN)
If FSO.FileExists(StrSysDrv & "\LogFile.txt") Then
Set LogFile = FSO.OpenTextFile(StrSysDrv & "\LogFile.txt",ForAppending)
LogFunction()
Else
FSO.CreateTextFile(StrSysDrv & "\LogFile.txt")
Set LogFile = FSO.OpenTextFile(StrSysDrv & "\LogFile.txt",ForAppending)
LogFunction()
End If
WScript.Sleep(300000)
Next


End Function



Function LogFunction()


LogFile.Write String(10,"-")
LogFile.Write VbCrLf
LogFile.Write StrComputer & " has been issued a shutdown command at " & time() & " on " & date()
LogFile.Write VbCrLf
Logfile.Close

End Function
[/code=vb]

Acties:
  • 0 Henk 'm!

  • Rataplan_
  • Registratie: Maart 2000
  • Laatst online: 03-09 11:31
shadowman12 schreef op zondag 15 maart 2009 @ 19:39:
Ik heb nu dit script gemaakt, met sleep vanaf robvanderwoude.com. Kan ik dat nog verbeteren, of is het zo goed. Ik ben het script nu aan het testen, en gaat hij wel erg vaak die for loop door, is daar wat aan te doen? Het parallellisme is niet nodig, om dat het toch maar om maximaal 100 servers zal gaan.
for /f %%G in (servers.txt) do (
sleep for 300
shutdown /s /f /m \\%%G
if errorlevel 1 do (
echo Server %%G shutdown FAILED on %date% at %time% >>log.txt
)
else
(
echo Server %%G shutdown on %date% at %time% >>log.txt
)
)
Je hebt inmiddels al aangegeven dat je verder gaat met VB, maar ik wil nog even kwijt dat die for-loop net zo vaak draait als je regels (servernamen) in die textfile hebt staan. Zo niet is er ergens wat anders verkeerd gegaan... Voor tests zet ik vaak voor de regels 'echo' neer, dan echo'ed hij de uit te voeren commandline naar screen.

Acties:
  • 0 Henk 'm!

  • alt-92
  • Registratie: Maart 2000
  • Niet online

alt-92

ye olde farte

shadowman12 schreef op zondag 15 maart 2009 @ 20:34:
Ook geeft ie foutmeldingen als een bepaalde machine niet aan staat.
Wat zei ik nou? :)
alt-92 in "\[2003] Servers afsluiten + VBScript"

:P

ik heb een 864 GB floppydrive! - certified prutser - the social skills of a thermonuclear device


Acties:
  • 0 Henk 'm!

Verwijderd

shadowman12 schreef op zondag 15 maart 2009 @ 20:34:
Allen,

Ik was toch niet helemaal blij met die batch-file dus daarom ben ik maar weer door gegaan op het VbScript uit begin. Ik heb daar een Wscript.Sleep in toegevoegd maar die lijkt niet helemaal lekker te gaan.Ook geeft ie foutmeldingen als een bepaalde machine niet aan staat. Hoe kan ik dat verbeteren:

[code=vb]
'Setting Constants
Const FORCESHUTDOWN = 5
Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20
Const HKEY_LOCAL_MACHINE = &H80000002
Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8
Const Overwrite = True
'Dim variables to memory
Dim Wshshell, ObjEnv, FSO, StrTempDir, StrWinDir, StrSysDrv, ServerFileShutdownList, StrComputer
Dim LogFile



'Setting Variables
Set Wshshell = CreateObject("Wscript.Shell")
Set ObjEnv = WshShell.Environment("Process")
Set FSO = CreateObject("Scripting.FileSystemObject")
StrTempDir = objEnv("TEMP")
StrWinDir = objEnv("WINDIR")
StrSysDrv = objEnv("SystemDrive")


'Input box to enter Server Name
ServerFileShutdownList = InputBox("Enter File Path here and File Name","Datacenter Shutdown File Prompt")
If ServerFileShutdownlist <> "" Then
If FSO.FileExists(ServerFileShutdownList) Then
'Read Input File and turn lines into Variables
Set File = FSO.OpenTextFile(ServerFileShutdownList)
'Loop through Text File
Do While File.AtEndOfStream <> True
StrComputer = File.ReadLine()
' Call Shutdown Function
ServerShutdown()
Loop
Else
MsgBox "ERROR!! The File that was selected cannot be located. Please check the File location", vbCritical, "ERROR!"
'Exiting Script with Error
WScript.Quit
End If
Else
MsgBox "ERROR!! No Input File. Please Input a Server List to Shutdown.", vbCritical, "File Input Error"
'Exiting Script with Error
WScript.Quit
End If



WScript.Quit



Function ServerShutdown()


Set oWMI = GetObject("winmgmts:{impersonationLevel=impersonate,(Shutdown)}\\" &_
strComputer & "\root\cimv2")
Set colOperatingSystems = oWMI.ExecQuery("Select * from Win32_OperatingSystem")
For Each objOperatingSystem in colOperatingSystems
objOperatingSystem.Win32Shutdown(FORCESHUTDOWN)
If FSO.FileExists(StrSysDrv & "\LogFile.txt") Then
Set LogFile = FSO.OpenTextFile(StrSysDrv & "\LogFile.txt",ForAppending)
LogFunction()
Else
FSO.CreateTextFile(StrSysDrv & "\LogFile.txt")
Set LogFile = FSO.OpenTextFile(StrSysDrv & "\LogFile.txt",ForAppending)
LogFunction()
End If
WScript.Sleep(300000)
Next


End Function



Function LogFunction()


LogFile.Write String(10,"-")
LogFile.Write VbCrLf
LogFile.Write StrComputer & " has been issued a shutdown command at " & time() & " on " & date()
LogFile.Write VbCrLf
Logfile.Close

End Function
[/code=vb]
dus eerst even controleren of een machine wel aanstaat... wmi w32_ping (?, kan iets anders heten) doet dat snel. moet echter de uitvoerende machine wel xp of hoger zijn anders heb je die wmi class niet.
Pagina: 1