sv.phhsnews.com


sv.phhsnews.com / Använda en batchfil för att göra PowerShell-skript enklare att köra

Använda en batchfil för att göra PowerShell-skript enklare att köra


Av flera anledningar är de flesta säkerhetsrelaterade, PowerShell-skript inte lika lättportabla och användbara som batchskript kan vara. Vi kan dock kombinera ett batch-skript med våra PowerShell-skript för att arbeta kring dessa problem. Här visar vi några av de problemområdena och hur man bygger ett batchskript för att komma runt dem.

Varför kan jag inte bara kopiera min .PS1-fil till en annan dator och köra den?

Om inte målsystemet är förkonfigurerat för att tillåta körning av godtyckliga skript, med de nödvändiga behörigheterna och med rätt inställningar, är risken att du kommer att stöta på några problem när du försöker göra det.

  1. PowerShell är som inte är associerad med .PS1-filtillägget som standard. Vi tog upp det här först i vår PowerShell Geek School-serie. Windows associerar .PS1-filer till Anteckningar som standard istället för att skicka dem till PowerShell-kommandotolken. Detta är för att förhindra oavsiktligt utförande av skadliga skript genom att helt enkelt dubbelklicka på dem. Det finns sätt att ändra detta beteende, men det är nog inte något du vill göra på varje dator som du bär dina skript runt, särskilt om några av dessa datorer inte är dina egna.
  2. PowerShell tillåter inte extern scriptexekvering som standard. Inställningen ExecutionPolicy i PowerShell förhindrar att externa skript utförs som standard i alla versioner av Windows. I vissa Windows-versioner tillåter standard inte alls att skriptet körs. Vi visade dig hur du ändrar inställningen i Så här tillåter du utförandet av PowerShell-skript på Windows 7. Det här är också något du inte vill göra på bara vilken dator som helst.
  3. Vissa PowerShell-skript fungerar inte utan Administratörsbehörigheter. Även om du kör ett administratörsnivåkonto behöver du fortfarande gå igenom användarkontokontroll (UAC) för att utföra vissa åtgärder. Vi vill inte inaktivera det här, men det är fortfarande trevligt när vi kan göra det lite lättare att hantera.
  4. Vissa användare kan ha anpassade PowerShell-miljöer.
    Du kommer nog inte att komma in på det här ofta, men när du gör det kan det bli spännande och felsökning av dina skript lite frustrerande. Lyckligtvis kan vi komma runt detta utan att göra några permanenta förändringar också.

Steg 1: Dubbelklicka för att köra.

Låt oss börja med att ta itu med det första problemet - .PS1-filföreningar. Du kan inte dubbelklicka för att köra .PS1-filer, men du kan utföra en .BAT-fil på det sättet. Så ska vi skriva en batchfil för att ringa PowerShell-skriptet från kommandoraden för oss.

Så vi behöver inte skriva om batchfilen för varje skript, eller varje gång vi flyttar ett skript runt, det kommer att använda sig av en egenreferensvariabel för att bygga filbanan för PowerShell-skriptet. För att göra detta arbete måste batchfilen placeras i samma mapp som ditt PowerShell-skript och har samma filnamn. Så om ditt PowerShell-skript heter "MyScript.ps1", vill du namnge din batchfil "MyScript.bat" och se till att det finns i samma mapp. Sedan lägger du dessa rader i batch-scriptet:

@ECHO OFF PowerShell.exe -Command "& '% ~ dpn0.ps1'" PAUSE

Om det inte fanns andra säkerhetsbegränsningar på plats, skulle det Det är verkligen allt som krävs för att köra ett PowerShell-skript från en batchfil. Faktum är att de första och sista linjerna bara är en fråga om preferens - det är den andra raden som verkligen gör jobbet. Här är nedbrytningen:

@ECHO OFF stänger av kommando-ekko. Detta hämtar bara dina andra kommandon från att visas på skärmen när batchfilen körs. Den här linjen är själv gömd av användningen av symbolen (@) framför den.

PowerShell.exe-Kommandot "& '% ~ dpn0.ps1'" körde verkligen PowerShell-skriptet. PowerShell.exe kan givetvis kallas från ett CMD-fönster eller en batchfil för att starta PowerShell till en rak konsol som vanligt. Du kan också använda den för att köra kommandon direkt från en batchfil, genom att inkludera parametern -Command och lämpliga argument. Så här används detta för att rikta in vår .PS1-fil med den speciella% ~ dpn0-variabeln. Kör från en batchfil utvärderas% ~ dpn0 till drivbrevet, mappvägen och filnamnet (utan tillägg) i batchfilen. Eftersom batchfilen och PowerShell-skriptet kommer att ligga i samma mapp och ha samma namn, kommer% ~ dpn0.ps1 att översättas till den fullständiga filbanan i PowerShell-skriptet.

PAUSE pausar bara batchexekveringen och väntar på användarinmatning. Det här är vanligtvis användbart att ha i slutet av dina batchfiler, så att du får chansen att granska någon kommandoutmatning innan fönstret försvinner. När vi går igenom provning av varje steg kommer användbarheten av detta att bli tydligare.

Så är den grundläggande batchfilen konfigurerad. För demonstrationen sparas den här filen som "D: Script Lab MyScript.bat" och det finns en "MyScript.ps1" i samma mapp. Låt oss se vad som händer när vi dubbelklickar på MyScript.bat.

Självklart körde inte PowerShell-skriptet, men det kan förväntas - trots allt har vi bara behandlat det första av våra fyra problem. Det finns emellertid några viktiga punkter som visas här:

  1. Fönstertiteln visar att batchskriptet framgångsrikt startade PowerShell.
  2. Den första raden av utdata visar att en anpassad PowerShell-profil används. Detta är potentiellt problem # 4, listat ovan.
  3. Felmeddelandet demonstrerar ExecutionPolicy-begränsningar i kraft. Det är vårt problem # 2.
  4. Den understrukna delen av felmeddelandet (som är gjort native av PowerShells felutgång) visar att batchskriptet riktades in riktigt mot det avsedda PowerShell-skriptet (D: Script Lab MyScript.ps1). Så vi vet åtminstone att mycket fungerar korrekt.

Profilen är i det här fallet ett enkelt enstegsskript som används för denna demonstration för att generera produktionen när profilen är aktiv. Du kan anpassa din egen PowerShell-profil för att göra det även om du vill testa dessa skript själv. Lägg bara till följande rad i ditt profilskript:

Skrivutskrift 'Anpassad PowerShell-profil i kraft!'

Exekveringspolicy på testsystemet här är inställt på RemoteSigned. Detta möjliggör utförande av skript som skapats lokalt (som profilskriptet), medan blockering av skript från externa källor om de inte är signerade av en betrodd myndighet. För demonstrationsändamål användes följande kommando för att flagga MyScript.ps1 som från en extern källa:

Add-Content -Path 'D:  Script Lab  MyScript.ps1' -Value "[ZoneTransfer] 'nZoneId = 3 "-Stream" Zone.Identifier '

Det sätter Zone.Identifier alternativ dataströmmen på MyScript.ps1 så att Windows kommer att tro att filen kom från Internet. Det kan enkelt vändas med följande kommando:

Clear-Content -Path 'D:  Script Lab  MyScript.ps1' -Stream 'Zone.Identifier'

Steg 2: Komma runt ExecutionPolicy.

Komma igång runt inställningen ExecutionPolicy, från CMD eller en batch script, är faktiskt ganska enkelt. Vi ändrar bara den andra raden av manuset för att lägga till en parameter till PowerShell.exe-kommandot.

PowerShell.exe -ExecutionPolicy Bypass-Kommando "& '% ~ dpn0.ps1'"

Parametern -ExecutionPolicy kan användas för att modifiera ExecutionPolicy som används när du krossar en ny PowerShell-session. Detta kommer inte att fortsätta utöver den sessionen, så vi kan köra PowerShell så här närhelst vi behöver utan att försämra systemets allmänna säkerhetsställning. Nu när vi har fixat det, låt oss få en annan gå till det:

Nu när manuset har utförts korrekt kan vi se vad det egentligen gör. Det låter oss veta att vi kör skriptet som en begränsad användare. Skriptet körs faktiskt av ett konto med administratörsbehörigheter, men användarkontokontrollen kommer i vägen. Även om detaljer om hur man letar efter skriptet för administratörsåtkomst ligger utanför denna artikels omfattning, här är koden som används för demonstration:

om (([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity] :: GetCurrent ()) .InsInRole ([Security.Principal.WindowsBuiltInRole] "Administratör")) {Skriv-Output 'Kör som administratör!'} Annars {Skriv-utdata 'Running Limited!'} Paus

Du kommer också märka att det nu finns två "Pause" -operationer i manusutmatningen - en från PowerShell-skriptet och en från batchfilen. Skälet till detta kommer att bli tydligare i nästa steg.

Steg 3: Få administratörsbehörighet.

Om ditt skript inte kör några kommandon som kräver höjning, och du är ganska säker på att du inte kommer att ha att oroa sig för någons anpassade profiler i vägen, du kan hoppa över resten av detta. Om du kör några cmdlets på administratörsnivå behöver du det här stycket.

Tyvärr finns det inget sätt att utlösa UAC för höjning från en batchfil eller CMD-session. PowerShell tillåter dock oss att göra detta med Start-Process. När det används med "-Verb RunAs" i sina argument, försöker Start-Process att starta ett program med administratörsbehörigheter. Om PowerShell-sessionen inte redan är förhöjd kommer detta att utlösa en UAC-prompt. För att använda detta från batchfilen för att starta vårt skript kommer vi att sluta gyta två PowerShell-processer - en för att avaktivera Start-Process och en annan, lanserad av Start-Process, för att köra skriptet. Den andra raden i batchfilen måste ändras till följande:

PowerShell.exe -Command "& {Start-Process PowerShell.exe -ArgumentList '-ExecutionPolicy Bypass -File" "% ~ dpn0.ps1" "' - Verb RunAs} "

När batchfilen körs, kommer den första raden av utdata som vi ser är från PowerShell-profilskriptet. Då kommer det att finnas en UAC-prompt när Start-Process försöker starta MyScript.ps1.

Efter att ha klickat på UAC-prompten kommer en ny PowerShell-instans att hälla. Eftersom det här är en ny instans, kommer vi naturligtvis igen att se profilskriptmeddelandet. Sedan kör MyScript.ps1 och vi ser att vi verkligen är i en förhöjd session.

Och det är anledningen till att vi har två pauser här också. Om inte för den i PowerShell-skriptet så ser vi aldrig skriptets utdata - PowerShell-fönstret skulle bara dyka upp och försvinna så fort skriptet är klart. Och utan pausen i batchfilen kunde vi inte se om det fanns några fel som startade PowerShell i första hand.

Steg 4: Komma över anpassade PowerShell-profiler.

Låt oss bli av med det otäcka anpassad profil meddelande nu ska vi? Här är det knappast till och med en olägenhet, men om en användares PowerShell-profil ändrar standardinställningar, variabler eller funktioner på sätt som du kanske inte har förväntat dig med ditt skript, kan de vara mycket besvärliga. Det är mycket enklare att köra ditt skript utan profilen helt, så du behöver inte oroa dig för det här. För att göra det behöver vi bara ändra den andra raden i batchfilen en gång till:

PowerShell.exe -NoProfile -Command "& {Start-Process PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File" "% 9 dpn0.ps1" "'-Verb RunAs}"

Lägga till -NoProfile-parametern i båda instanserna av PowerShell som lanseras av manuset innebär att användarens profilskript kommer att vara helt förbikopplat i båda stegen och vårt PowerShell-skript kommer att köras i en ganska förutsägbar, standardmiljö. Här kan du se att det inte finns något anpassat profilmeddelande i någon av de spridda skalen.

Om du inte behöver administratörsrättigheter i ditt PowerShell-skript och du har hoppat över steg 3, kan du göra utan den andra PowerShell-förekomsten och Den andra raden i din batchfil ska se så här ut:

PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "& '% ~ dpn0.ps1'"

Utgången kommer då att se ut så här:

( Självklart kan du, för icke-administratörskript, göra utan en paus för slutet av skriptet i ditt PowerShell-skript även här eftersom allt är fångat i samma konsolfönster och skulle hållas där med pausen i slutet av batchfil ändå.)

Avslutade batchfiler.

Beroende på huruvida du behöver administratörsbehörigheter för ditt PowerShell-skript (och du borde verkligen inte begära dem om du inte gör det) ska den sista batchfilen se ut som ett av de två nedan.

Utan administratörsbehörighet:

@ECHO OFF PowerShell.exe -NoProfile -ExecutionPoli cy bypass-kommando "&"% ~ dpn0.ps1 " PAUSE

Med Admin-åtkomst:

@ECHO AV PowerShell.exe -NoProfile -Command "& {Start-Process PowerShell.exe -ArgumentList '-NoProfile - ExecutionPolicy Bypass -File "% ~ dpn0.ps1 " '-Verb RunAs} "PAUSE

Kom ihåg att sätta batchfilen i samma mapp som PowerShell-skriptet du vill använda det för, och ge det samma namn . Då, oavsett vilket system du tar dessa filer till, kommer du kunna köra ditt PowerShell-skript utan att behöva krossa med någon av säkerhetsinställningarna på systemet. Du kan säkert göra de här ändringarna manuellt varje gång, men det sparar dig det besväret och du behöver inte oroa dig för att återställa ändringarna senare.


Referenser:

  • Köra PowerShell-skript från en batchfil - Daniel Schroeder Programmeringsblogg
  • Kontrollerar administratörsbehörigheter i PowerShell - Hej, Scripting Guy! Blogg


Så här kontrollerar du routern för skadlig kod

Så här kontrollerar du routern för skadlig kod

Konsumentruter säkerhet är ganska dålig. Attackers drar nytta av lackadaisical tillverkare och attackerar stora mängder routrar. Så här kontrollerar du om din router har äventyras. Marknaden för hemrouter är mycket som Android-smarttelefonmarknaden. Tillverkare producerar ett stort antal olika enheter och inte stör dem, vilket gör att de är öppna för attack.

(how-to)

Så här kombinerar du text från flera celler i en cell i Excel

Så här kombinerar du text från flera celler i en cell i Excel

Om du har ett stort arbetsblad i en Excel-arbetsbok där du måste kombinera text från flera celler kan du andas en suck av lättnad eftersom du inte behöver skriva in all den texten. Du kan enkelt sammanfoga texten. Concatenate är helt enkelt ett fint sätt att säga "att kombinera" eller "att gå med ihop" och det finns en särskild CONCATENATE-funktion i Excel för att göra detta.

(how-to)