ragnar harper


MVP/Powershell

Powershell MVP

Posted by ragnar harper on

Tilbake fra ferieturen fikk jeg en hyggelig overraskelse – jeg har blitt MVP iforbindelse med min innsats rundt Powershell.

Takk til alle som hører på meg 🙂 Det er dere som gjør dette mulig!

MVP

Certificate Services/Powershell

Hvordan liste ut sertifikater som utløper snart?

Posted by ragnar harper on

Etter å ha bistått i flere PKI implentasjoner på Microsoft plattform er det ett spørsmål som går igjen:

Hvordan liste ut sertifikater som utløper i nærmeste fremtid?

Dette kan man gjøre med certutil.exe kommandoen, men i disse Powershell tider har jeg laget et Powershell script som benytter certutil – men som formaterer sertifikatetene som objekter. Dette gjør at det er mye enklere å jobbe videre med sertifikatene. Merk at scriptet må kjøres på CA serveren.

Eksempel:

Get-ExpiringCertificates.ps1
Standard lister ut alle sertifikater som utløper iløpet av 180 dager

Get-ExpiringCertificates.ps1 -InNumberOfDays 30
Dette vil liste ut de sertifikatene som utløper i løpet av 30 dager

Get-ExpiringCertificates.ps1 -InNumberOfDays 30 -ExcludeAutoEnroll
Dette vil liste ut de sertifikatene som utløper i løpet av 30 dager, untatt de som er satt til  åfornye seg automatisk.

Du kan laste ned scriptet herfra http://blog.crayon.no/files/folders/scripts/entry13037.aspx

Source:

# ==============================================================================================
#
# NAME: Get-ExpiringCertificates.ps1
#
# AUTHOR: Ragnar Harper
# DATE  : 18.04.2009
#
# COMMENT: List out expiring certificates. Needs to be run on the Certificate Authority.
#            Takes two parameters:
#            InNumberOfdays
#                           If not given, defaults to 180 days from today. This is the number
#                           of days to check for expiring certificates
#             ExcludeAutoEnroll
#                           Excludes certificates that autoenroll from the list
#
# USAGE:
#    .\Get-ExpiringCertificates.ps1
#    .\Get-ExpiringCertificates.ps1 -InNumberOfDays 30
#    .\Get-ExpiringCertificates.ps1 -InNumberOfDays 30 -ExcludeAutoEnroll
# ==============================================================================================
param(
[int]$InNumberOfDays=180,
[switch]$ExcludeAutoEnroll)
function WriteCertInfo($cert)
{
#just a lot of code to get the fields into an object
$certObj = "" | Select RequesterName,RequestType,ExpirationDate,CommonName,EnrollmentFlags
$RequesterName=$cert -match "Requester Name:.*Request Type:"
$startLength="Requester Name:".Length
$lineLength=$matches[0].Length -("Request Type:".Length + $startLength)
$OutRequesterName=$matches[0].SubString($startLength,$lineLength)
$certObj.RequesterName=$OutRequesterName
$RequestType=$cert -match "Request Type:.*Certificate Expiration Date:"
$startLength="Request Type:".Length
$lineLength=$matches[0].Length - ("Certificate Expiration Date:".Length + $startLength)
$OutRequestType=$matches[0].SubString($startLength,$lineLength)
$certObj.RequestType=$OutRequestType
$ExpirationDate = $cert -match "Certificate Expiration Date:.*Issued Common Name:"
$startLength="Certificate Expiration Date:".Length
$lineLength=$matches[0].Length - ("Issued Common Name:".Length + $startLength)
$OutExpirationDate=$matches[0].SubString($startLength,$lineLength)
$certObj.ExpirationDate=$OutExpirationDate
$IssuedCommonName= $cert -match "Issued Common Name:.*Template Enrollment Flags:"
$startLength="Issued Common Name:".Length
$lineLength=$matches[0].Length - ("Template Enrollment Flags:".Length + $startLength)
$OutCommonName=$matches[0].SubString($startLength,$lineLength)
$certObj.CommonName=$OutCommonName
$EnrollmentFlags= $cert -match "Template Enrollment Flags:.*"
$startLength="Template Enrollment Flags:".Length
$lineLength=$matches[0].Length - ($startLength)
$OutEnrollmentFlags=$matches[0].SubString($startLength,$lineLength)
$certObj.EnrollmentFlags=$OutEnrollmentFlags
if($ExcludeAutoEnroll)
{
if(($OutEnrollmentFlags -match "CT_FLAG_AUTO_ENROLLMENT") -eq $false)
{
$script:CertToList+=$certObj
}
}
else
{
$script:CertToList+=$certObj
}
}
$CertToList=@()
$today=Get-Date
$endperiod=$today.AddDays($InNumberOfDays)
#List certificates that expire within 180 days from now
$tester=certutil -view -restrict "NotAfter>=$today,NotAfter<=$endperiod" -out "RequestID,RequesterName,RequestType,NotAfter,CommonName,EnrollmentFlags"
$arr=$tester -match "Row \d*:"
$numberOfCerts=$arr.length
$line=[string]::join(" ",$tester)
for($certNo=0;$certNo -lt $numberOfCerts;$certNo=$certNo+1)
{
$r1=$arr[$certNo]
if($certNo -ne ($numberOfCerts-1))
{
$r2=$arr[$certNo+1]
}
else
{
$r2="Maximum Row Index"
}
$isFound=$line -match "$r1 .* $r2"
$NumberOfChars=$matches[0].Length - $r2.Length
$thisCert=$matches[0].SubString(0,$NumberOfChars)
WriteCertInfo($thisCert)
}
$CertToList
AppLocker/Windows 7

Litt om AppLocker

Posted by ragnar harper on

Windows AppLocker er en av nyhetene i Windows 7 og Windows Server®2008 R2. AppLocker erstatter Software Restriction Policies og gir oss nye muligheter som reduserer behovet for administrasjon. I tillegg blir det enklere å kontrollere hvordan brukerne kan aksessere og benytte kjørbare filer som exe filer, script, msi og msp samt dll´er.

AppLocker hjelper deg med å begrense adgangen til filer som ikke tillates kjørt – foreksempel fordi du ikke er lisensiert eller programmet er ondsinnet.

Hva tilbyr AppLocker?

  • Definere regler basert på attributter som knyttet til en digital signatur. Dette inkluderer utgiver, produkt navn, filnavn og filversjon. Du kan lage regler som fungerer uavhengig av versjon, eller du kan knytte regler til spesifikke versjoner av en fil.
  • AppLocker spesifierer kun filene som har lov til å kjøre  – filer som ikke er med i en regel tillates ikke kjørt.

  • Regler kan knyttes til grupper eller brukere

  • Du kan opprette unntak for .exe filer. For eksempel kan du lage en regel som tillater alle Windows prosessene å kjøre bortsett fra Regedit.exe

  • Du kan også kjøre i “audit-only” modus hvor filene som ikke er “tillatt” blir identifisert

  • Importere og eksportere regler

Merk : Du kan ikke knytte AppLocker regler til Internet soner, individuelle maskiner, eller registry baner.

Som standard vil ikke AppLocker tillate å kjøre applikasjoner eller filer som ikke er spesifikt tillatt. Administrator bør opprettholde en liste over tillatte applikasjoner.

AppLocker fungerer kun med Windows 7 og nyere.

Mange har klaget over at Software Restriction Policies har vært vanskelige å forholde seg til – AppLocker gjør det enklere. For å øke sikkerheten i en bedrift er whitelistning av applikasjoner en veldig fin måte, dog har den vært veldig omfattende. AppLocker gjør dette enklere – hvor mye gjenstår å se 🙂

AD RMS/Windows Server 2008

Valg av operativsystem for Active Directory Rights Management Services

Posted by ragnar harper on

Active Directory Rights Management Services (AD RMS) er en løsning for å beskytte digitalt innhold. AD RMS håndterer sikkerhet rundt hvordan dokumenter og epost blir brukt og distribuert både internt og eksternt.

AD RMS definerer usage policies som spesifiserer adganger til innholdet. Dette kan spesifiseres som brukere, grupper av brukere, maskiner og applikasjoner. Adganger og rettigheter til innholdet kan være les, klipp/lim,skriv ut, lagre, videresend og rediger. Videre kan rettighetene være knyttet til tilstander, slik som gyldighet til ett visst tidspunkt.

Disse usage policiene er en del av dokumentet, og følger dokumentet uansett lokasjon.

Siste versjon av Active Directory Rights Management Services er en del av Windows Server 2008.

Viktige egenskaper I Active Directory Rights Management Services som kun er tilgjenglig på Windows Server 2008:

  • Installasjon som en Server rolle (er en del av operativsystemet)
  • Administrasjon gjennom standardisert Microsoft Management Console (Windows Server 2003 versjon bruker web grensesnitt)
  • Integrasjon med Active Directory Federation Services for federering av identitet
  • Mulighet for delegering av administrative oppgaver gjennom bruk av roller. Roller kun tilgjenglig på Windows Server 2008 er RMS Enterprise Adminstrators, RMS Template Administrators og RMS Auditors
  • Aktivering av serveren kan gjøres med egne sertifikat
Powershell

Hvordan jobbe med Computer objektet?

Posted by ragnar harper on

Powershell 2.0 kommer det en god del nye kommandoer – blant annet mange nyttige kommandoer for å jobbe med maskinobjektet. På min Windows 7 build 5047 kjørte jeg følgende kommando for å få oversikt over maskinkommandoene:

Get-Command *Computer* –CommandType CmdLet

Her er mine maskin kommandoer:

Add-Computer : Melde maskin inn i domene/workgroup

CheckPoint-Computer : Oppretter et system-restore point

Disable-ComputerRestore : Slår av system restore på angitte stasjon

Enable-ComputerRestore : Aktiverer system restore på angitte stasjon

Get-ComputerRestorePoint : Lister ut liste over restorepoints. Viser også status på siste restore forsøk.

Remove-Computer : Melder maskina ut av domenet. Deaktiverer maskinkontoen.

Reset-ComputerMachinePassword : Resetter maskinkonto passordet for maskina

Restore-Computer: Kjører en System Restore på angitte restorepunkt

Stop-Computer : Slår av maskina

Restart-Computer : Restarter maskina

Test-ComputerSecureChannel : Verifiserer tilstanden på forbindelsen mellom maskina og domenet. Returnerer true hvis alt er ok, false hvis ikke. Om du får false kan du prøve –Repair parameteren for å reparere forbindelsen.

Powershell

Hvorfor Powershell?

Posted by ragnar harper on

Det er ikke å komme bort fra at kommandolinja og scriptmiljøet i Windows har hatt forbedringspotensiale. Windows har jo fokusert på det grafiske grensesnittet og kommandolinja og automatiseringsmulighetene via script har i en årrekke kommet lenger bak i køen. Løsningen frem til i dag har vært mange uavhengige grensesnitt som ikke har medført stor gevinst på tvers av hverandre. Kommandoer har ikke hatt de samme parametrene, og har de hatt de samme parametrene, har ikke disse nødvendig oppført seg likt. Behovet for automatisering har steget etter hvert som Windows har tatt på seg større og større roller i en bedriftsnettverk. Med automatiseringsbehovet kommer behovet for et komplett ”shell” og scriptingmiljø. Vel, jeg har nå gleden av å annonsere ventetiden som over; med PowerShell har ikke bare Windows fått et ok miljø – men Windows har fått det beste!

Her er miljøet som er like interaktivt som BASH, like programmerbart som Perl og like produksjonsorientert som AS400 CL/VMS DCL. Med andre ord – det beste av det beste – og bedre blir det. PowerShell er nemlig bygd på .NET, og tilfører objekter til miljøet. Med andre ord; når PowerShell returnerer en liste over prosessene som kjører på ei maskin, er det ikke bare ei liste med ”død” tekst. Det er faktiske referanser til prosessene. Det betyr at vi kan jobbe med utdataene på en helt ny måte, hvor vi kan aktivt utføre handlinger på utdataene vi får. Dette tar jeg for meg i kapittelet om objektorientering, men du kommer til å oppleve det i mange eksempler før det også. PowerShell tilfører altså mye nytt til Windows miljøet, men i tillegg lar det deg fortsatt benytte ”gamle” mekanismer og metoder. Dette er flott, da det gir deg mulighet for å ta være på alt det du har utviklet av kunnskaper frem til i dag. Script du allerede har utviklet i VBScript, batchjobber du har utviklet – alt dette kan du fortsatt ta med deg. Men i tillegg får du førsteklasses adgang til .NET rammeverket på en måte du ikke har hatt anledning til tidligere. Og ikke minst en enhetlig kommandolinje og scriptingmiljø i PowerShell. PowerShell er kraftfullt – og hvis du tror det ikke kan løses i PowerShell har du antagligvis ikke prøvd nok  Powershell har ett aktivt miljø av bidragsytere – du finner mange eksempler på Internett. Det er også slik at de nye server applikasjonene fra Microsoft benytter Powershell til administrering. Like intressant er det å observere at også andre selskaper ser nytten av Powershell til administrering, og for eksempel VmWare og F5 Networks. I tillegg finnes det et rikt økosystem av tillegg til Powershell.

Powershell/Regex

Regular Expressions og Powershell

Posted by ragnar harper on

Regular expressions er “wildcards” på steroider. Det er med andre ord vesentlig mer kraftfullt en standard “wildcard”.

Regular Expressions (heretter kalt for regex) er kraftfullt, og vi skal her se på hvordan du kan komme igang med det. De operatørene som virker med regex er –match og –replace, og varianter av disse, slik som –cmatch,-imatch,-notmatch,-cnotmatch,-inotmatch, -creplace og –ireplace. C variantene står for case sensitiv, altså følsomme for store og små bokstaver, mens i variantene er ikke sensitive på store og små bokstaver.

Et godt eksempel på en problemstilling regex løser er å hente ut alle ip-adressene fra for eksempel ei logfil. Vi vet ikke nødvendigvis hvor i dokumentet ip-adressene er lagret, men vi vet hvilken form de har, og kan benytte regex til å gjenkjenne dette mønsteret, for så å hente det ut.

For å forstå regex trenger du å kjenne til noen spesialtegn som benyttes :

Tegn<o:p></o:p>

Beskrivelse<o:p></o:p>

\w

Tilsvarer alfanumeriske tegn eller underscore ( _ )<o:p></o:p>

\d<o:p></o:p>

Tilsvarer siffer (0-9)<o:p></o:p>

\t<o:p></o:p>

Tilsvarer TAB (tabulator)<o:p></o:p>

\s<o:p></o:p>

Tilsvarer mellomrom, tabulator eller newline<o:p></o:p>

<o:p> </o:p>Ved å benytte stor bokstav istedet for liten blir meningen motsatt. Altså, \D betyr ikke siffer, og \W betyr ikke et alfanumerisk tegn eller underscore. Merk at dette ikke er et fullstendig uttrekk av spesialtegn, men de du oftest får behov for å kunne.

Resultatet av en regex operasjon lagres automatisk i variablen $matches.

“PowerShell rules!” –match “\w* \w*”

$matches<o:p></o:p>

Følgende eksempel krever at det er to ord for å gi true (gir false på ett ord og mer enn to):

“PowerShell rules!” –match “^\w* \w*$”

La oss benytte PowerShell til å sjekke om teksten vår er tall:

“PowerShell rules!” –match “\d”

Prøv nå følgende:<o:p></o:p>

“123” –match “\d”

Det første eksemplet skal returnere false, da det ikke er et tall. I det andre eksemplet får du returnert true, ettersom at det er tall.

La oss nå sjekke om noe er en ip-adresse. VI begynner enkelt med å sjekke for 4 grupper med tall, adskilt med punktum:

[62] » "10.1.1.200" -match "^\d+\.\d+\.\d+\.\d+$"
True

[63] » "10.1.1" -match "^\d+\.\d+\.\d+\.\d+$"
False

Videre vet vi at en IP-adresse kun kan bestå at tre tall i hver gruppe. La oss erstatte + med {1.3}. Som ser av tabellen over betyr {1,3} minst en forekomst, og maks 3. Med \d{1,3} sier vi altså tall, minimum et tegn, og maksimum 3 tegn langt.

[74] » "10.1.1.200" -match "^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$"
True

Powershell/Windows 7

Powershell : Windows 7 Troubleshooting pack

Posted by ragnar harper on

I Windows 7 kan du gjøre en god del feilsøking / analyse gjennom Powershell. Du kan importere en modul som heter TroubleshootingPack med  kommandoen:

Import-Module TroubleshootingPack

image

Som alltid kan du se hvilke kommandoer som er tilgjenglig i en Module med kommandoen Get-Command på følgende måte:

Get-Command -Module Troubleshootingpack

For eksempel kan du nå laste inn feilsøkingspakker for aero, lyd, ytelse, nettverk og strøm:

$aero=Get-TroubleshootingPack C:\windows\diagnostics\system\aero

$audio=Get-TroubleshootingPack c:\windows\diagnostics\system\audio

$perf=Get-TroubleshootingPack c:\windows\diagnostics\system\performance

$net=Get-TroubleshootingPack C:\windows\diagnostics\system\Networking

$power=Get-TroubleshootingPack C:\windows\diagnostics\system\Power

Hvis for eksempel du har problemer med aero kan du nå kjøre:

$aero.Diagnose()

og deretter

$aero.FoundRootCauses

Du vil da få en liste over årsaker til at Aero ikke fungerer. Hvis du ønsker å se en liste med alle årsakene som er definert i pakken kan du se dette med:

$aero.RootCauses

image

På dette bildet ser du hvordan jeg gjør en diagnose av ytelsen på maskinen, og får tilbakemelding om at mange programmer kjøres ved oppstart

Windows 7/Windows Server 2008 R2

Endringer i logging (Security auditing)

Posted by ragnar harper on

Men Windows 7 og Windows Server 2008 R2 kommer det endringer i logghåndteringen.

Formålet med dette er å gjøre loggen mer detaljert, samt å forenkle administrasjonen av loggepolicy

Blant forbedringene er:

  • Global Object Access Auditing. Her kan du definere logging for enten filsystem eller registry på maskin-nivå. SACL(som inneholder logkonfigurasjon) blir da påført alle objektene av typen du har angitt.
  • "Reason for access" reporting. Du vil nå få grunnlaget for en avgjørelse (for hvorfor adgang var tillatt/nektet) på et bestemt objekt.
  • Advanced audit policy settings. 53 nye instillinger som kan brukes istedet for de 9 instillingene under  Local Policies\Audit Policy. (9 på XP/2003, 50 på Vista/2008 men disse kan kun påvirkes gjennom auditpol.exe) På denne måten får du en mer finmasket kontroll over hva som logges, og kan utelukke og eliminere unødvendige aktiviteter fra loggen – og tilgjenglig via Group Policy.