# encoding: utf-8
# api: powershell
# title: Query MagisterWebservice
# description: EN: Send a webquery to Schoolmaster Magister web service and request data
# version: 0.1
# type: script
# author: Paul Wiegmans
# license: CC0
# function: Write-Log
# x-poshcode-id: 3922
# x-archived: 2014-05-23T00:23:23
# x-published: 2014-01-30T11:04:00
#
# from the list WISMASLEERLING.
# NL: Doe een webquery naar Magister webservice en haal de lijst WISMASLEERLING op.
#
<#
.TITLE
Haal-WisMasLeerling.ps1
.AUTHOR
Paul Wiegmans (p [dot] wiegmans [at] bonhoeffer [dot] nl)
.DATE
2013-01-30
.DESCRIPTION
Send a webquery to Schoolmaster Magister web service and request data
from the list WISMASLEERLING.
Doe een webquery naar Magister webservice en haal de lijst WISMASLEERLING op.
.NOTES
.LINK
http://ict.bonhoeffer.nl
#>
Import-Module ActiveDirectory
Set-StrictMode -Version 2
$mijnpad = Split-Path -parent $MyInvocation.MyCommand.Definition
$mijnbasename = $([System.IO.Path]::GetFileNameWithoutExtension($MyInvocation.MyCommand.Definition))
$logging = $true # geef uitvoer naar logfile
$outputting = $true # geef uitvoer naar console
$outputVreemdetekens = $true # geef uitvoer naar console indien vreemde tekens opgemerkt
$aantal = 0
$SOAPLayout = "WISMASLEERLINGEN"
$SOAPusername = "username"
$SOAPpasswd = "password"
Function Write-Log ($tekst) {
<# stuur uitvoer naar een logfile en naar console #>
$logtekst = ("{0:0###}: {1}" -f ($aantal, $tekst))
if ($outputting) {
Write-Host $logtekst
}
if ($Logging) {
#$logtekst | Out-File "$mijnpad\$mijnbasename.log" -Append
}
}
function Doe-Webquery ([string]$Url, [System.Text.Encoding]$encoding = [System.Text.Encoding]::UTF7) {
# .SYNOPSIS
# Voert een SOAP webquery uit
# .DESCRIPTION
# Voert een SOAP webquery uit.
# Retourneert het resultaat van de qebquery in een array met string
# .PARAMETER Url
# De URL van de webquery
# .PARAMETER ENcoding
# De [system.text.encoding] encoding van de webquery
# .EXAMPLE
# $lines = Doe-Webquery "https://bonhoeffer.swp.nl:8800/doc?Bladibla..."
# .NOTES
# Auteur: Paul Wiegmans
# Datum: 30 mrt 2012
$request = [System.Net.WebRequest]::Create($Url)
try {
$response = $request.GetResponse()
}
catch [Net.WebException] {
Write-Host $_.Exception.ToString()
exit
}
$requestStream = $response.GetResponseStream()
# We must read the Magister webquery in UTF7 to preserve the accents!
$readStream = new-object System.IO.StreamReader( $requestStream, $Encoding )
$result = $readStream.ReadToEnd() -split "`n" # convert to array of strings
$readStream.Close()
$response.Close()
return $result
}
Function Ophalen-Magister () {
<# Haal leerlinglijst op van Magister via SOAP #>
# kale URL is https://bonhoeffer.swp.nl:8800/doc?Function=GetData&Library=Data&SessionToken=adfeeder%3Belo.33&Layout=Basistest&Parameters=leerjaar%3D1213&Type=CSV
$SOAPUrl = "https://bonhoeffer.swp.nl:8800/doc?Function=GetData"`
+"&Library=Data&SessionToken=$SOAPusername%3B$SOAPpasswd&Layout=$SOAPlayout"`
+"&Parameters=leerjaar%3D1213&Type=CSV"
$iso88591 = [System.Text.Encoding]::GetEncoding("ISO-8859-1")
$UTF7 = [System.Text.Encoding]::UTF7
$data = Doe-Webquery $SOAPUrl $UTF7
if ($data -is [string]) {
if (($data.contains("Fout")) -or ($data.contains('ResultMessage'))) {
# haal opnieuw met andere encoding zodat foutmelding zichtbaar wordt.
$data = Doe-Webquery $SOAPUrl $iso88591
Write-Log $SOAPUrl
Throw "Webquery retourneert fout (1): $data"
}
}
if ($data[0] -is [string]) {
if ($data[0].contains("Fout_nummer") ) {
Write-Log $SOAPUrl
Throw "Webquery retourneert fout (2): $data"
}
}
return ($data | Out-String) -replace "`r`r","`r"
}
function VerwijderVreemdeTekens($n) {
<# vervangt alle niet-alfabettekens door gelijkende alfabettekens #>
$VervangTabel = @(`
"ñn","êe","ëe","èe","ée","áa","äa","öo","óo","ïi","úu","ûu","çc","�S","�s","�s","ýy","-","'")
# 'Moûrik' Ibánez' '�romofský'
foreach ($letter in $VervangTabel) {
$n = $n -replace $letter[0], $letter[1]
}
return $n
}
Function VertaalTekens ($n) {
<# VertaalTekens vervangt alle vreemde tekens uit webquery naar de juiste tekens,
voor speciaal geval �romofský . Dit doet een eerst conversie van vreemde tekens
uit de data in ANSI-codering naar herkenbare vreemde tekens, zodat deze later
vervangen, door romeinse tekens. Leer de code door uitvoer "onvertaald.txt"
te zien in hexeditor XVI32.
#>
return $n -replace [char]138, "�" -replace [char]0x9a, "�"
}
# --------------------------------------------------------------------
# --- M A I N ---
# --------------------------------------------------------------------
Write-Host " "
Write-Log "Start --- "
# resultaat bestaat uit regels tekst gescheiden door 0D, 0D, 0A
# dit is gelijk aan `r `r `n
$onvertaald = Ophalen-magister
$onvertaald | Out-File "$mijnpad\onvertaald.txt"
$csv = vertaaltekens $onvertaald | ConvertFrom-Csv -Delimiter ";" # maak array met records
$csv | Export-CSV -Path "$mijnpad\wismasleerling.csv" -Encoding UTF8 -NoTypeInformation
Write-Log ("Gegevens in webquery: {0}" -f $csv.count)
if (($csv.Count -lt 1490) -or ($csv.Count -ge 1570)) {
throw "Webquery geeft onwaarschijnlijk aantal resultaten. Uitvoering stopt."
}
$csv | Out-GridView; exit