De av oss som har jobbet eller jobber i småbedrifter slutten av IT-yrket vet at mens automatisering er viktig det er vanskelig å holde med de nyeste skripting teknologier. Fordi vi er så opptatt med å holde vår virksomhet går, er vår tid for å lære skriptspråk begrenset så når vi får tak i noe som fungerer vi har en tendens til å fortsette å bruke det selv når rattet i fremgang har flyttet på. Som et resultat vi har en tendens til å mikse og matche ulike skriptspråk og teknikker slik at vi kan fokusere på den viktigste oppgaven vi trenger å gjøre: generere inntekter for vår virksomhet
Get-NetAdapter og Get-VMNetworkAdapter
.
Jeg har gjort min egen andel av DOS-stil batch scripting og VBScript i det siste, og jeg har selv spilt med andre plattformer som Perl og KiXtart når det er nødvendig. Og mens Windows Powershell er nå mine går til språk for Windows Server automatisering, er det fortsatt ganger når jeg finner ut at en enkel batch script eller par linjer med VBScript gjør jobben ganske enkelt. Så i den forstand jeg er nok som de fleste andre administratorer som arbeider med små organisasjoner og bruk det jeg har for hånden til å bare gjøre jobben og gå videre. Som et resultat av mine egne skript pleier å være ganske rotete og ikke "elegant" som det egentlig ingen rolle for meg om en oppgave jeg utføre ved hjelp av 50 linjer med kode som kan gjøres ved hjelp av bare fem linjer. Jobben er jobben, og spaghetti fyller magen uansett hvor rotete det ser ut på plate.
Nylig en av leserne av vår WServerNews.com nyhetsbrev, Jeffrey Harris, delte noen av sine egne skript erfaringer med meg, og jeg ønsket å dele dem her på WindowsNetworking.com så de av dere som gjør det for små organisasjoner kan fange opp noen tips og ideer du kan bruke til å bedre administrere miljøer. Jeffrey er en IT Professional med over 30 års erfaring som har en CISSP sertifisering og spesialiserer seg på sikkerhet og identitetsforvaltning. Hans tidligere arbeidsoppgaver har tatt det amerikanske Department of Homeland Security, Pentagon og Det hvite hus, der han tjenestegjorde som hvite hus e-post administrator. Etter nesten 19 år som jobber for et stort IT-tjenester (siste 10 telependling fra sitt hjem i delstaten New York), Jeffrey søker for tiden etter en ny stilling på grunn av en nylig nedbemanning så hvis du tror du kan bruke sin kompetanse og erfaring bør du nå ut til ham snart før han får snappet opp av en annen organisasjon.
Og forresten, hvis du ennå ikke er abonnent på vårt ukentlige nyhetsbrev WServerNews du bør skynde og bli med nesten 100.000 andre IT-eksperter rundt verden ved å abonnere på den på http://www.wservernews.com/subscribe.htm.
Nå la oss høre fra Jeffrey Harris ...
Scripting for administratorer
Skript-kan betraktes programmering av den ikke-programmerer. Som systemansvarlig og systemer ingeniør, har jeg brukt scripting for en rekke profesjonelle formål, for eksempel:
Automat prosedyrer som vanligvis tas ved hjelp av et GUI verktøy, redusere tiden det tar å utføre handling, i noen tilfeller til sekunder og minutter i stedet for timer, sparer mine kunder penger
Dele en prosedyre med IT-avdelingen.; man kan dokumentere en prosedyre og dele dokumentasjon, men scripting gir andre IT-ansatte muligheten til å enkelt og greit utføre inngrepet, noe som reduserer muligheten for at ansatte gjennomføre inngrepet manuelt kan kjøre det på feil måte, spesielt hvis dokumentasjonen er feil eller ufullstendig.
Gir en reproduserbar prosess for konfigurering av flere systemer, eller ulike systemer over tid, og dermed redusere feil som kan innføres i systemene.
Scripting kan innebære en rekke skriptspråk. Den grunnleggende skript er en serie av DOS eller Windows kommandoer, lagres som en BAT eller CMD-fil (heretter benevnt som en kommando-fil). Andre vanlige Windows-skriptspråk er VBScript (mye brukt før utgivelsen av Vista /Windows Server 2008) og Powershell (nå Microsoft foretrukne skriptspråk). Denne artikkelen vil diskutere noen vanlige skript og kommandofiler jeg bruker for ulike administrative formål. Jeg antar en grunnleggende forståelse av ulike Windows-kommandoer, slik som bcdedit, diskpart, fm, etc.
Noen bruker for skripting
De viktigste administrative områder der bruker jeg skript er systemoppsett og operasjoner ledelse. Siden jeg ofte satt opp Windows arbeidsstasjoner eller servere for kunder i små organisasjoner, uten bedriftens verktøy som SCCM, jeg ønsket å utvikle en repeterbar prosess. Jeg begynte år siden ved å lage en sjekkliste over vanlige aktiviteter som jeg ville utføre på hvert system under installasjonsprosessen. Selv om nesten alle systemene er annerledes på noen måte, en rekke innstillinger er felles for arbeidsstasjoner, servere, eller begge deler. Ettersom tiden gikk, innså jeg at heller enn å bare definere hva innstillingene er i en sjekkliste, og deretter implementere dem manuelt, jeg kunne automatisere prosessen ved å lage kommandofiler eller skript for å faktisk gjennomføre det meste av innstillinger, og nå har jeg et sett . av skript som jeg kjører for hver nye systemet jeg satt opp
For servere, noen av mine vanlige innstillinger er:
Dump filer - siden jeg nesten aldri sende dumpfiler til Microsoft , er det ingen mening for meg å konfigurere systemer for å opprette fulle dumpfiler, men det er nyttig informasjon som kan være lokalt analysert i en mini-dump filen
Startup tid. - Jeg tror 30 sekunder (standardtiden ) for en server for å boot er for lang; 10 sekunder synes mer hensiktsmessig for meg, da det gir en administrator tid til å klikke F8 hvis det er nødvendig for å starte systemet med alternative innstillinger, for eksempel sikkermodus.
For å automatisere prosessen med å konfigurere disse to innstillinger, laget jeg følgende kommando fil. Kommandoen for å konfigurere mini-dump filen fungerer med alle versjoner av Windows, men kommandoene for å sette opp oppstartstiden for systemet fungerer bare med Windows Vista /Windows Server 2008 eller nyere operativsystemer. Kommandofilen bekrefter også at oppstartstiden er riktig endret ved å vise oppstartstid innstillingen etter at den nye tid er konfigurert (den første linjen er pakket):
reg legge HKLM \\ System \\ CurrentControlSet \\ Control \\ Crashcontrol /v CrashDumpEnabled /t REG_DWORD /d 3 /fbcdedit /timeout 10REM bekrefte at timeout innstillingen ble oppdatert i bagasje configbcdedit /enum {Bootmgr} | findstr -i "timeout" pause
En annen vanlig endring jeg gjør er å flytte systemet CD -ROM /DVD stasjonsbokstaven for servere. Jeg generelt konfigurere disse systemene med flere partisjoner (eller i noen tilfeller, flere stasjoner er konfigurert som separate RAID 1 arrays). Siden systemet CD-ROM /DVD-stasjon generelt standard til D :, jeg bruke sc og DISKPART kommandoer (i kombinasjon med en sekundær-fil som inneholder de spesifikke DISKPART handlinger som skal utføres) for å endre CD-ROM /DVD-stasjon brev til G: (dette gir vanligvis tilstrekkelig sammenhengende bokstaver for harddiskpartisjoner på de systemene jeg satt opp):
echo onsc starte vdsif errorlevel == 1 (sc config vds start = etterspørsel & & sc starte VDS) diskpart /. s \\ supportfiles \\ fixcd.txtpause
Kommandoene i fixcd.txt filen er:
velge volum 0assign brev g noerrselect volum 1assign brev g noerrexit
Jeg vil peke ut i forbifarten at i fravær av multippel logiske volumer, er det CD-ROM /DVD-stasjon generelt volum 0 eller volum 1, avhengig av hvordan systemet prioriterer driv enheter i systemet.
For småskala distribusjon av flere systemer, eller tar et bilde av en system å bruke som en basis for gjenoppretting, har jeg brukt Microsofts ImageX utility (nå erstattet med DISM) for å registrere og legge inn bilder (for større distribusjoner, i fravær av SCCM, jeg bruker Microsoft Deployment Toolkit [MDT]). Jeg har brukt varianter av følgende kommando filen for å søke eller gjenopprette Windows-bildefiler til et system (kommandoene nedenfor vil gjelde en bildefil av skjemaet "myimage-system.wim" til systempartisjonen, og et andre bilde av skjemaet "myimage.wim" til en sekundær [d:] partisjon eller kjøre):
REM% 1 er plasseringen og filnavnet for bildet (dvs. e: \\ images \\ myimage.wim) REM Hvis det er mellomrom i filbanen eller beskrivelse, legge tekst i anførselstegn, som vist ovenfor @ echo offif "% 1" == "" goto EndFor /f "tokens = 1,2 * delims =.", %% G i ('echo% 1') Gjør ImageX /apply "%% G-system %% H." 1 c: \\ /verifyimagex /apply "% 1" 1 d: \\ /bekrefte: end
Noen ganger har jeg konfigurert IPsec for å sikre forbindelser mellom systemer ( eksempel ved hjelp av Ajp13 protokollen på port 8009 mellom en Apache-server og en Oracle-server som kjører Application Express evne). Kommandofilen nedenfor gjelder en IPsec "AJP Secure Connection" politikk til det lokale systemet ved hjelp av en rekke beslektede netsh kommandoer. Legg merke til at en av settet og alle de netsh kommandolinjene nedenfor er innpakket.
REMecho offREM ************************* ******************* REM Start-IPSEC Regler Dokumentasjon SectionSet PolicyName = Ajp13 Sikre ConnectionSet PolicyDesc = Ajp13 sikker tilkobling mellom Apache1 server og Tomcat servere vert på Oracle RAC ServersREM End IPSEC Regler Dokumentasjon SectionREM ******************************************** REM Denne filen er bare for andre Tomcat ServersREM ******************************************** REM start IPSEC Regler netsh Command SectionECHO Hit en tast for å søke IPSEC personvern -% PolicyName% pauseREM satt kilde vertsnavn eller IP-adresse for Apache proxy serverSet source-adresse = Apache1.mycompany.comREM satt reisemålet vertsnavnet eller IP-adressen til destinasjon Tomcat serversSet bestemmelsessted Adresse 1 = Oracle1.mycompany.comSet Destination-address2=Oracle2.mycompany.com@echo onnetsh IPsec statisk add politikk name = "% policyname%" tildele = yes description = "% policydesc%" activatedefaultrule = nonetsh IPsec statisk add filteraction name = " Krev full sikkerhet "qmpfs = yes inpass = ingen myk = ingen qmsecmethods =" ESP [3DES, SHA1] "action = forhandle description =" Ingen åpen kommunikasjon "netsh IPsec statisk legge filterlist name =" Ajp13 Filter List "description =" Vertsnavn og Port for AJP Communications "netsh ipsec statisk legge filter filterlist =" Ajp13 Filter List "srcaddr =% kilde adressen% dstaddr =% destination-Adresse 1% description =" Connection fra Apache til Tomcat Server1 "protokoll = TCP speiles = yes srcport = 8009netsh IPsec statisk add filter filterlist = "Ajp13 Filter List" srcaddr =% kilde adressen% dstaddr =% destination-Address2% description = "Connection fra Apache til Tomcat Server2" protokoll = TCP speiles = yes srcport = 8009netsh IPsec statisk add regel name = "Secure Ajp13 Rule" policy = "% policyname%" filterlist = "Ajp13 Filter List" filteraction = "Krev Full Security" conntype = lan aktivere = ja description = "Secure Communications for AJP fra Apache til Tomcat" Kerberos = ja @ echo offREM Avslutt IPSEC Regler netsh Command SectionREM ******************************************** echo.echo Import completed.echo.echo Hit en tast for å stoppe og starte IPSEC Service for å aktivere IPSEC Policyecho.pausenet stoppe "IPsec tjenester" net start "IPsec tjenester" echo.echo Restart completepause
Scripting for operativ bruk
Jeg har også opprettet skript og kommandofiler for operativ bruk. Den spesielle språket jeg bruker for en gitt oppgave har vært avhengig av kompleksiteten av handlingen, og språkene som støttes av operativsystemet. De fleste av mine scripting har blitt gjort ved hjelp av kommandofiler, eller, der kommandofiler ikke gir de nødvendige evner (for eksempel tilgang til Active Directory eller WMI, lesing innspill konfigurasjonsfiler eller omfattende formatering utdatafiler), jeg har brukt VBScript. Min utstrakt bruk av VBScript skyldtes en klient miljø som var hovedsakelig Windows Server 2003-basert. Powershell var en add-on til Windows Server 2003 mens VBScript ble bygget inn som operativsystem, og at klientens miljø, så jeg ingen grunn til å prøve og presse for en add-on som økte angrepsflaten av virksomhetskritiske systemer.
Siden Windows Server 2003 er nå nærmer seg slutten av støtte, og de fleste organisasjoner har Windows Server 2008R2 eller 2012 /R2 servere, er jeg nå fokuserer på å bruke Powershell nesten utelukkende, unntatt når du utfører en oppgave i en kommandofil gjør mer sans. I noen tilfeller er det fornuftig å kombinere en kommando-fil med en Powershell script. For noen dager siden, hadde jeg et behov for en "touch" -kommandoen til å nullstille endrede datoer på filer, og så jeg brukte DOS kombinert med Powershell-kode for å opprette følgende kommandofilen (DOS setter opp henrettelsen miljø, med Powershell faktisk gjør endre til den endrede datoen for filen):
REM Parameter 1 - filnavn (med eller uten bane) - requiredREM Parameter to - date string - requiredREM Parameter 3 - tid string - optionalREM Parameter 4 - bokstavelig AM eller PM - optionalREM parametere 3 og 4 kan være combinedREM Abort hvis Parameter en ikke specifiedif "% 1" == "" (ekko Ingen fil spesifisert ... abortingGoto End) REM Abort hvis Parameter 2 ikke specifiedif "% 2" == "" (ekko Nei ny dato spesifisert ... abortingGoto End) REM Hvis vi nå her, satt sist endret dato /timepowershell (Get-Item "% 1"). LastWriteTime = '% 2% 3% 4'REM Kontroller sist endret dato /tid var updatedpowershell "& {(Get-Element% 1) | format-liste-Eiendoms navn, lastwritetime}": Slutt
Det var en vanskelig aspekt til blant annet Powershell kommandoer direkte i kommandofilen versus å bruke kommandofilen til kalle en Powershell script med Powershell kommandoer som er lagret i et eget script fil: bruk av enkle eller doble anførselstegn. Da jeg kjørte kommandoene i en Powershell kommandolinje tolk, de kjørte riktig med doble anførselstegn. Likevel nøyaktig samme syntaks forårsaket en henrettelse feil når innebygging innen kommandofilen. Bare å endre de doble anførselstegn til enkle anførselstegn for den nye LastWriteTime verdi løst problemet, selv om det var ingen doble anførselstegn innebygd i noen av Parameter 2, 3 eller 4 teksten.
En annen bruk i de siste dagene var å gi en mekanisme for relativt usofistikert brukere å endre DNS-servere på trådløse nettverk hvor de lokale DNS-servere som tilbys via DHCP viste seg upålitelig. Selv om selve netsh kommandoene var relativt enkel å implementere, behovet for å ta hensyn til UAC på brukernes systemer kjørte bruk av Powershell til å opprette en hevet lede skallet for å utføre netsh kommandoer; utføring av netsh kommandoen direkte ville føre til at operasjonen mislykkes når UAC ble aktivert. Følgende kommando (lagret i en kommandofil) kaller en nestkommanderende fil som skal utføres netsh kommandoer for å sette statisk DNS-servere for det trådløse nettverkskortet på systemet:
Powershell Oppstart Process staticdns.cmd -Verb RunAs
kommandoene i andre kommandofilen (staticdns.cmd) er:
echo offnetsh interface ipv4 sett dnsservers name = "trådløs nettverkstilkobling" source = statisk 24.25.5.60 validere = nonetsh grensesnitt IPv4 legge dnsservers name = "trådløs nettverkstilkobling "24.25.5.61 validere = nonetsh grensesnitt IPv4 legge dnsservers name =" trådløs nettverkstilkobling "8.8.8.8 validere = nonetsh grensesnitt IPv4 legge dnsservers name =" trådløs nettverkstilkobling "8.8.4.4 validere = noecho.echo Hvis DNS-oppføringer som vises etter å ha klikket en nøkkel er 24.25.5.60, 24.25.5.61, 8.8.8.8 og 8.8.4.4, endringen workedecho.pausenetsh interface ipv4 viser dnsservers name = "trådløs nettverkstilkobling" echo.echo Ferdig! pause
En mer detaljert eksempel
Flytte tilbake til VBScript, jeg en gang fant meg selv i behov av et skript som kunne avhøre nettverkskort adapter driverversjoner og generere en loggfil. Skriptet trengs for å kjøre mot alle servere i en bestemt OU. Når skrevet, skjønte jeg at det ga et rammeverk for å tillate andre handlinger som skal utføres ved ganske enkelt å innkapsle den handlingen som skal utføres innenfor en funksjon kalt av hoved script gang en forbindelse til hver server ble etablert. For eksempel kan den lokale administratorpassordet endres på flere servere via et domene administrator uten å få tilgang til hver server via eksterne konsollen eller eksterne tilkoblingsverktøy (for eksempel serveradministrasjon MMC snap-in).
Dette VBScript behandler en oversikt over medlems servere innenfor en spesifisert OU i en bestemt Active Directory-domene (eller alle medlemsservere i domenet), og bruker WMI Authentication å returnere en liste over WMI attributter fra hver server (hvis den eksterne serveren kan kobles til) :
Konklusjon
Scripting er en nyttig funksjon som alle systemadministratorer bør vite. Bruk av scripting kan spare tid, redusere feil og forbedre evnen til administratorer for å gjøre endringer i systemer eller samle inn informasjon i fravær av bedriftens systemer som SCCM. Jeg er enig med sitatet fra Jeffery Hicks i en senere WServerNews nyhetsbrev: "De som glemmer å script er dømt til å gjenta sitt arbeid." Som systemadministratorer, ville vi ikke heller gjøre noe en gang, og deretter gå videre til neste utfordrende prosjekt?
Andre ressurser
Det er mange ressurser på nettet som kan hjelpe administratorer lære å skript i ulike språk. Enda bedre er det mange nettsteder og blogger der ute som har eksempel skript du kan være i stand til å bruke med lite eller ingen tilpasning for å løse IT-utfordringer du møter. Her er noen av de beste ressursene som kommer til tankene:
Rob van der Woude sin Scripting Pages - kjempefint område med masse eksempel skript i Powershell, VBScript, KiXstart, Perl, batch-filer og andre språk .
Hei, Scripting Guy! Blog - Ed Wilson fra Microsoft opprettholder dette utmerket blogg hvor Powershell script-tips og triks blir forklart og demonstrert
skriptsenteret Repository på Microsoft TechNet - nyttige eksempel skript skrevet i Powershell og VBScript
skriptsenteret Forum på TechNet - stille et spørsmål og få hjelp fra skript guruer på Microsoft og fra MVPer og andre
Windows Powershell Scripting - denne delen på TechNet Script Center inneholder webcasts og andre ressurser for å hjelpe deg å lære eller forbedre din Powershell skripting ferdigheter