Sikkepitje.nl

Sikkepitje.nl

this private cloud

Magister SOAP AD functie opvragen voorbeeld

De Schoolmaster Magister SOAP/XML Webservice uitlezen anno 2020 doen we als volgt in PowerShell. Grote voordelen:

  • Door op te halen in XML krijgen we de resultaten direct in een variable
  • Encoding problemen zijn voorbij.
$magisterUser = "gebruikersnaam"
$magisterPass = "wachtwoord"
$magisterUrl = "https://school.swp.nl:8800/doc"

# haal sessiontoken
$SessionToken_Login = $magisterUrl +
"Library=Algemeen&Function=Login&UserName=" + $magisterUser +
"&Password=" + $magisterPass + "&Type=XML"
$feed = [xml](new-object system.net.webclient).downloadstring($SessionToken_Login)
$SessionToken = $feed.response.SessionToken    

function Run-Webclient($url) {
    $wc = New-Object System.Net.WebClient
    $wc.Encoding = [System.Text.Encoding]::UTF8
    $feed = [xml]$wc.downloadstring($url)
    return $feed.Response.Data    
}
function ADFunctie2 ($functie, $SessionToken) {
    return Run-Webclient -Url ($magisterUrl + "library=ADFuncties&function=" `
    + $functie + "&SessionToken=" + $SessionToken + "&LesPeriode=&Type=XML")
}
function ADFunctie3 ($functie, $SessionToken, $stamnr) {
    return Run-Webclient -Url ($magisterUrl + "library=ADFuncties&function=" + `
    $functie + "&SessionToken=" + $SessionToken + "&LesPeriode=&StamNr=" + $stamnr + "&Type=XML")
}

$stamnr = 10104
$data = ADFunctie3 -F "GetLeerlingGroepen" -Ses $sessiontoken -st $stamnr
foreach ($vak in $data.Vakken.Vak) {
    write-host $vak.groep
}

$data = ADFunctie2 -F "GetActiveStudents" -Ses $SessionToken
$ll = $data.Leerlingen.Leerling | Select-Object `
    stamnr_str,achternaam,tussenv,roepnaam,loginaccount.naam,klas,studie,profiel.code

$data = ADFunctie2 -F "GetActiveEmpoyees" -Ses $SessionToken
$docent = $data.Personeelsleden.Personeelslid | Select-Object `
    stamnr_str,achternaam,tussenv,roepnaam,loginaccount.naam,code,Functie.Omschr

Magister SOAP custom query

Oftewel hoe we in 2020 "lijsten" opvragen. Dit is een andere methode.

# Globals
$user = "soapuser"
$pass = "soappassword"
$tenant = "school"
$layout = "weblijst"

# Construct uri
$uri = "https://$tenant.swp.nl:8800/doc?Library=Data&Function=GetData&SessionToken=$user%3B$pass&Layout=$layout&Parameters=&Type=CSV&encoding=ANSI"

# Read the data
$request = [System.Net.WebRequest]::Create($uri)
$response = $request.GetResponse()
$requestStream = $response.GetResponseStream()
$encoding = [System.Text.Encoding]::UTF7
$readStream = New-Object System.IO.StreamReader($requestStream, $encoding)
$data = $readStream.ReadToEnd()
$readStream.Close()
$response.Close()

# Convert raw data to CSV
$csv = ConvertFrom-Csv $data -Delimiter ";"

Test MagisterSOAP

<#
    Snel testen of Magister webservice werkt

    21-1-2021 Paul Wiegmans

    URL van produktiedatabase: https://school.swp.nl:8800/soap
    URL van testdatabase: https://school.swp.nl:8801/soap

    Silvie beweert dat de testomgeving niet toegankelijk is.

    Ja dat klopt. en het klopt niet...
    De eerste keer inloggen krijg je een melding en wordt de omgeving gesloten,.....
    De eerste keer wordt de omgeving namelijk "wakker"gemaakt.
    Log je daarna in, dan werkt het..
    Die tweede keer inloggen moet binnen vijf minuten gebeuren
#>


$magisterUser = "gebruikersnaam"
$magisterPass = "wachtwoord"
$magisterUrl = "https://school.swp.nl:8800/doc"

function Invoke-Webclient($url) {
    $wc = New-Object System.Net.WebClient
    $wc.Encoding = [System.Text.Encoding]::UTF8
    try {
        $feed = [xml]$wc.downloadstring($url)
    } catch {
        $e = $_.Exception
        $line = $_.InvocationInfo.ScriptLineNumber
        $msg = $e.Message
        Throw "Invoke-Webclient: caught exception: $e at line $line : $msg"
    }
    if ($feed.Response.Exception) {
        Write-Host ("Invoke-Webclient: " + $feed.Response.Exception + ": " + $feed.Response.ExceptionMsg)
        return $feed.Response
    }
    return $feed.Response.Data    
}
function ADFunction ($Url = $magisterUrl, $Function, $SessionToken) {
    return Invoke-Webclient -Url ($Url + "?library=ADFuncties&function=" +
        $Function + "&SessionToken=" + $SessionToken + "&LesPeriode=&Type=XML")
}

# haal sessiontoken
Clear-Host
Write-Host "Login ..."
$feed = ""
$GetToken_URL = $magisterUrl + "?Library=Algemeen&Function=Login&UserName=" +
    $magisterUser + "&Password=" + $magisterPass + "&Type=XML"
$feed = [xml](new-object system.net.webclient).downloadstring($GetToken_URL)
if ($feed.Response.Result -ne "True") {
    Throw "Fatale fout in SOAP-query: " + $feed.Response.ResultMessage
}
$MyToken = $feed.response.SessionToken

Write-Host "Ophalen docenten..."
$mag_doc = @()
$data = ""
$data = ADFunction -Url $magisterUrl -Sessiontoken $MyToken -Function "GetActiveEmpoyees"  

$mag_doc = $data.Personeelsleden.Personeelslid | Select-Object `
    @{Name = 'Stamnr'; Expression = {$_.stamnr_str}},
    @{Name = 'Id'; Expression = { $null }},
    @{Name = 'Login'; Expression = {$_.'loginaccount.naam'}},
    Code, Roepnaam, Tussenv, Achternaam,
    @{Name = 'Naam'; Expression = {$_.'Loginaccount.Volledige_naam'}},
    @{Name = 'Functie'; Expression = { $_.'Functie.Omschr' }},
    @{Name = 'Locatie'; Expression = { $_.'Administratieve_eenheid.Omschrijving' }}

Write-Host "Opgehaald:" $mag_doc.count
$mag_doc | Select-Object -First 5 | Format-Table

SOAP queries naar testdatabase

Zoals de produktiedatabase te benaderen is via de URL https://school.swp.nl:8800/doc , zo zijn de gegevens uit de Magister testdatabase te benaderen via de URL https://school.swp.nl:8801/doc. De derde database is te benaderen via de URL https://school.swp.nl:8802/doc.