Af flere årsager er de fleste sikkerhedsrelaterede PowerShell-scripts ikke lige så let bærbare og anvendelige, som batchskripter kan være. Vi kan dog bundtes et batch script med vores PowerShell-scripts til at løse disse problemer. Her vil vi vise dig et par af disse problemområder, og hvordan du opbygger et batch script til at omgå dem.
Medmindre målsystemet er forudkonfigureret for at tillade, at der køres vilkårlig scripts, med de nødvendige privilegier og ved hjælp af de rigtige indstillinger, er det sandsynligt, at du vil løbe ind i nogle problemer, når du forsøger at gøre dette.
Lad os begynde med at løse det første problem - .PS1 filforeninger. Du kan ikke dobbeltklikke for at køre .PS1-filer, men du kan udføre en .BAT-fil på den måde. Så skriver vi en batchfil for at kalde PowerShell-scriptet fra kommandolinjen til os.
Så vi behøver ikke at omskrive batchfilen for hvert script, eller hver gang vi flytter et script rundt, det vil gøre brug af en selvrefererende variabel til at opbygge filstien til PowerShell-scriptet. For at gøre dette arbejde skal batchfilen placeres i samme mappe som dit PowerShell-script og have samme filnavn. Så hvis dit PowerShell script hedder "MyScript.ps1", vil du gerne navngive din batchfil "MyScript.bat" og sørg for, at den er i samme mappe. Derefter sæt disse linjer i batch scriptet:
@ECHO OFF PowerShell.exe -Command "& '% ~ dpn0.ps1'" PAUSE
Hvis det ikke var for de øvrige sikkerhedsrestriktioner på plads, ville det Det er virkelig alt, hvad der kræves for at køre et PowerShell-script fra en batchfil. Faktisk er de første og sidste linjer først og fremmest et spørgsmål om præference - det er den anden linje, der virkelig gør arbejdet. Her er nedbrydningen:
@ECHO OFF deaktiverer kommandoekko. Dette holder bare dine andre kommandoer fra at blive vist på skærmen, når batchfilen kører. Denne linje er selv skjult ved brug af symbolet (@) foran den.
PowerShell.exe -Command "& '% ~ dpn0.ps1'" kører faktisk PowerShell-scriptet. PowerShell.exe kan naturligvis kaldes fra ethvert CMD-vindue eller batch-fil for at starte PowerShell til en bare konsol som normalt. Du kan også bruge den til at køre kommandoer direkte fra en batchfil ved at inkludere parameteren -Command og relevante argumenter. Sådan bruges dette til at målrette vores .PS1-fil med den specielle% ~ dpn0-variabel. Kør fra en batch-fil, evaluerer% ~ dpn0 til drevbogstav, mappebane og filnavn (uden udvidelse) af batchfilen. Da batchfilen og PowerShell-scriptet vil være i samme mappe og have samme navn, vil% ~ dpn0.ps1 oversætte til den fulde filsti i PowerShell-scriptet.
PAUSE stopper bare batch-udførelsen og venter på brugerindgang. Dette er generelt nyttigt at have i slutningen af dine batch-filer, så du har mulighed for at gennemgå en kommandoudgang, før vinduet forsvinder. Når vi går gennem test af hvert trin, bliver brugen af dette mere tydelig.
Så er den grundlæggende batchfil konfigureret. Til demonstration er denne fil gemt som "D: Script Lab MyScript.bat" og der er en "MyScript.ps1" i samme mappe. Lad os se, hvad der sker, når vi dobbeltklikker på MyScript.bat.
Selvfølgelig kørte PowerShell-scriptet ikke, men det forventes - vi har jo først taget fat på det første af vores fire problemer. Der vises dog nogle vigtige punkter her:
Profilen er i dette tilfælde et simpelt enlinjet script, der bruges til denne demonstration til at generere output, når profilen er aktiv. Du kan tilpasse din egen PowerShell-profil til at gøre det også, hvis du selv vil teste disse scripts. Du skal blot tilføje følgende linje til dit profil script:
Skriv-Output 'Custom PowerShell-profilen i kraft!'
ExecutionPolicy på testsystemet her er indstillet til RemoteSigned. Dette tillader udførelse af scripts oprettet lokalt (som profil script), mens blokering af scripts fra eksterne kilder, medmindre de er underskrevet af en betroet myndighed. Til demonstrationsformål blev følgende kommando brugt til at flagge MyScript.ps1 som værende fra en ekstern kilde:
Add-Content -Path 'D: Script Lab MyScript.ps1' -Value "[ZoneTransfer] 'nZoneId = 3 "-Stream" Zone.Identifier '
Der sættes Zone.Identifier alternativ datastream på MyScript.ps1, så Windows vil tro, at filen kom fra internettet. Det kan let vendes med følgende kommando:
Ryd indhold -Path 'D: Script Lab MyScript.ps1' -Stream 'Zone.Identifier'
PowerShell.exe -ExecutionPolicy Bypass-Kommando "& '% ~ dpn0.ps1'"
Parameteren -ExecutionPolicy kan bruges til at ændre ExecutionPolicy, der bruges, når du kaster en ny PowerShell-session. Dette vil ikke vare ud over den session, så vi kan køre PowerShell sådan her, når vi har brug for uden at svække systemets generelle sikkerhedsstilling. Nu, da vi har rettet det, lad os få en anden gå til det:
Nu hvor scriptet er korrekt udført, kan vi se, hvad det rent faktisk gør. Det giver os besked om, at vi kører scriptet som en begrænset bruger. Scriptet kører i virkeligheden af en konto med administratorrettigheder, men brugerkontokontrol er i vejen. Selvom detaljer om, hvordan scriptet kontrollerer administratoradgang, er uden for denne artikels anvendelsesområde, her er koden, der bruges til demonstration:
hvis (([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity] :: GetCurrent ()). IsInRole ([Security.Principal.WindowsBuiltInRole] "Administrator")) {Skriv-Output 'Kører som administrator!'} Ellers {Skriv-Output 'Running Limited!'} Pause
Du vil også bemærke at der nu er to "Pause" -operationer i script-output - en fra PowerShell-scriptet og en fra batchfilen. Årsagen til dette bliver mere tydelig i næste trin.
Trin 3: Få administratoradgang.
Der er desværre ingen mulighed for at udløse UAC til højde fra en batchfil eller CMD-session. Men PowerShell gør det muligt for os at gøre dette med Start-Process. Når det bruges med "-Verb RunAs" i sine argumenter, vil Start-Process forsøge at starte et program med administratorrettigheder. Hvis PowerShell-sessionen ikke allerede er forhøjet, vil dette udløse en UAC-prompt. Hvis du vil bruge dette fra batchfilen til at starte vores script, vil vi ende med at gyde to PowerShell-processer - en til at slukke for Start-Process og en anden, startet af Start-Process, for at køre scriptet. Den anden linje i batchfilen skal ændres til dette:
PowerShell.exe -Command "& {Start-Process PowerShell.exe -ArgumentList'-ExecutionPolicy Bypass -File" "% ~ dpn0.ps1" "'- Verb RunAs} "
Når batchfilen køres, er den første linie af output, vi ser, fra PowerShell profil scriptet. Derefter vil der være en UAC-prompt, når Start-Process forsøger at starte MyScript.ps1.
Når du har klikket på UAC-prompten, vil en ny PowerShell-instans gyde. Fordi dette er en ny forekomst, vil vi selvfølgelig igen se profilskriftsmeddelelsen. Så kører MyScript.ps1 og vi ser at vi faktisk er i en forhøjet session.
Og der er grunden til, at vi også har to pauser herinde. Hvis ikke for den i PowerShell-scriptet, ville vi aldrig se scriptets output - vinduet PowerShell ville bare komme op og forsvinde, så snart scriptet er færdig med at køre. Og uden pause i batchfilen kunne vi ikke se, om der var fejl, der startede PowerShell i første omgang.
Trin 4: Kom godt i gang med brugerdefinerede PowerShell-profiler.
PowerShell.exe -NoProfile -Command "& {Start-Process PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File" "% 9 dpn0.ps1" "'-Verb RunAs}"
Tilføjelse af parameteren -NoProfile til begge instanser af PowerShell, der lanceres af scriptet, betyder, at brugerens profil script vil blive fuldstændigt omgået i begge trin og vores PowerShell script vil køre i et forholdsvis forudsigeligt, standardmiljø. Her kan du se, at der ikke er nogen brugerdefineret profilbesked i en af de tilstedeværende skaller.
Hvis du ikke har brug for administratorrettigheder i dit PowerShell-script, og du har hoppet over trin 3, kan du undvære den anden PowerShell-forekomst og Den anden linje i din batchfil skal se sådan ud:
PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "& '% ~ dpn0.ps1'"
Udgangen vil så se sådan ud:
( Selvfølgelig, for ikke-administrator scripts, kan du gøre uden en ende-of-script pause i dit PowerShell script på dette tidspunkt også, da alt er fanget i samme konsolvindue og ville blive holdt der ved pause i slutningen af batch-fil alligevel.)
Afsluttede batchfiler.
Uden admin adgang:
@ECHO OFF PowerShell.exe -NoProfile -ExecutionPoli Cy Bypass -Command "& '% ~ dpn0.ps1'" PAUSE
Med Admin adgang:
@ECHO OFF PowerShell.exe -NoProfile -Command "& {Start-Process PowerShell.exe -ArgumentList '-NoProfile - ExecutionPolis Bypass -File "% ~ dpn0.ps1 " '-Verb RunAs} "PAUSE
Husk at sætte batchfilen i samme mappe som PowerShell-scriptet, du vil bruge det til, og giv det samme navn . Så uanset hvilket system du tager disse filer til, kan du køre dit PowerShell-script uden at skulle kaste dig rundt med nogen af sikkerhedsindstillingerne på systemet. Du kan helt sikkert gøre disse ændringer manuelt hver gang, men det sparer dig for besvær, og du behøver ikke bekymre dig om at vende tilbage senere.
Referencer:
Running PowerShell-scripts fra en batchfil - Daniel Schroeder's programmeringsblog
Sådan ryddes din opkaldsoversigt på iPhone
Din iPhone holder en historie om de seneste opkald, du har lavet og modtaget. For det meste er denne liste ret praktisk. Hvis du favoriserer privatliv, er det dog nemt at slette individuelle opkald fra din iPhones opkaldshistorik eller slette hele den seneste opkaldsliste på én gang. Sådan gør du det.
Sådan bruger du Sonos som alarm eller hviletimer
Sonos er fantastisk, fordi du kan konfigurere og styre højttalere fra ethvert værelse i din bolig. Hvis du kan lide at vågne op eller falde i søvn til musik, så er de særligt velegnede til at have i dit soveværelse. RELATED: Sådan opretter du en ny Sonos-højttaler Når du først får din Sonos afspillere oprettet og konfigureret på alle dine enheder, så er det ligegyldigt hvor du er eller hvad du bruger, fordi du kan styre dem med næsten enhver enhed.