Gebruik jij ook nog typemachines in je bedrijf? 

Cedric Liesnard, onze Business Productivity Consultant, neemt je mee in een interessant stuk over de ‘impact’ van technologie versus technologie als een sociaal proces tussen verschillende mensen.

Technology marches in seven-league boots from one ruthless, revolutionary conquest to another, tearing down old factories and industries, flinging up new processes with terrifying rapidity.” – Charles A. Beard, 1927

Het kan vaak lijken alsof ontwikkelingen in de techniek als een stoomwals over ons heenkomen. Alsof er geen menselijke bestuurder meer op de stoel zit die de richting of snelheid van de wals kan beïnvloeden laat staan beheersen.

Voor veel mensen kan het ook lijken alsof dat gevoel iets nieuws is. Iets van de laatste paar decennia. Of in ieder geval iets van de tijd sinds zij zelf volwassen geworden zijn. Dit gevoel gaat echter veel verder terug dan je misschien zou denken. Binnen de sociologie van wetenschap en techniek staat dit idee – dat de sociale structuur van onze maatschappij voortvloeit uit een onbeheersbare technologische vooruitgang – bekend als technologisch determinisme.

‘De ‘impact’ van technologie

Dit technologisch determinisme is verleidelijk. Het is immers fijn om over technologie te denken alsof het een constante stroom van verbetering en vooruitgang betreft. Alsof de geschiedenis van technologische ontwikkeling een ordelijk en rationeel pad gevolgd heeft en de wereld om ons heen precies het doel was waar alle beslissingen sinds het begin der tijden naartoe gewerkt hebben.

Deze illusie wordt verder gevoed door onze obsessie met goede resultaten en successen. Maar als je je alleen richt op de zaken die achteraf succesvol blijken, kan je belangrijke en leerzame lessen makkelijk missen of negeren. Daarom ontstond in de sociologie eind vorige eeuw een theorie die recht tegen dit determinisme indruiste: sociaal constructivisme van technologie.

Sociaal constructivisme

Binnen dit raamwerk worden technologische ontwikkelingen gezien als product van een sociaal proces tussen verschillende mensen. Niet per se de (achteraf gezien) “beste” oplossing overleeft dus het innovatieproces, maar juist de oplossing die de meeste stakeholders over de streep trekt. Dit zou meteen vragen moeten oproepen: hoe kunnen we leren van fouten in plaats van ons te richten op successen? En waarom kan een “inferieur” product of proces als winnaar uit de bus komen?

Successen en mislukkingen

Om te beginnen dienen we successen en mislukkingen met hetzelfde gewicht te behandelen. Dit symmetrieprincipe voorkomt dat we successen uitleggen met de cyclische redenering “het is een succes geworden omdat het de beste oplossing was, en het was duidelijk de beste oplossing omdat het nu een succes is”. Als we dit symmetrieprincipe in gedachten houden blijkt vaak dat technologie die we nu als vanzelfsprekend of als intrinsiek de beste oplossing zien in werkelijkheid beïnvloed is door een enorm scala aan factoren waaronder cultuur, geschiedenis, identiteit, moraliteit, machtsverhoudingen, alsook willekeur en geluk.

Context is belangrijk

We vinden het vanzelfsprekend dat computers digitaal en in de basis gebaseerd op Booleaanse algebra zijn. Maar de eerste computers waren analoge machines, die op basis van elektrische, mechanische of hydraulische kwantiteiten een modeloplossing voor een probleem genereerden (zie bijvoorbeeld Deltar: Delta Getij Analogon Rekenmachine, gebruikt voor de Deltawerken).

Digitaal versus analoog?

Deze manier van werken bleek echter onhandig voor precieze berekeningen en niet geschikt voor gegeneraliseerde computers gebaseerd op het model van de Turingmachine. Als we hier niet verder over nadenken is de conclusie duidelijk: digitale computers zijn inherent beter dan analoge computers en dus overleefde de digitale computer en verdween de analoge.

Tegenwoordig is analoog echter aan een comeback bezig, dankzij de enorme groei van artificial intelligence waar gebruik gemaakt wordt van deep neural networks. Analoog was dus zeker geen slechte technologie, maar een waar door de relevante actoren binnen de computerwereld een tijd lang geen grote waarde aan werd toegekend. Als men deze “gefaalde” techniek dus had weggezet als “verdwenen, dus slecht en niet bruikbaar” zou er nu een potentiële oplossing voor een nieuw probleem ontbreken.

Reflectie is ook belangrijk

Wat is dan een voorbeeld van een “inferieur” product dat dankzij sociale processen een winnaar is? Neem het toetsenbord waarmee ik dit stuk geschreven heb. Dikke kans dat je toetsenbord, net als het mijne, een QWERTY-layout heeft (misschien AZERTY als je dit vanuit België leest). Is QWERTY dan de “beste” layout om Nederlands mee te schrijven? Je gokt het al: natuurlijk niet. Maar men was gewend aan QWERTY op de typemachines en dus werd deze overgeheveld naar toetsenborden voor computers.

Ga eens praten met iemand die de Dvorak-layout gebruikt en je bent al snel genezen van het idee dat QWERTY overleeft omdat iedereen het de “beste” layout vindt. Soms overleven bepaalde technologieën wel omdat ze beter geschikt zijn voor hun doel, maar dit moeten we niet beschouwen als een gesloten hoofdstuk of als een afgeronde stap in de technologieboom zoals die vaak in strategy games te vinden is.

Hoe zit het binnen jouw bedrijf?

Laat je successen dus eens voor wat ze zijn en ga als bedrijf na: wat kunnen we leren van onze “fouten” en “mislukkingen”? Wie weet heb je gewoon nog een oplossing liggen voor een probleem dat je in het verleden niet voorzien had. En vraag je eens af waarom je bepaalde processen hanteert zoals ze zijn. Is dat echt omdat het zo’n goede logische processen zijn? Of ben je uit gemakzucht met een eeuwenoude typemachine aan het werken?

“Help! Welk Teams-kanaal moet ik nu waarvoor gebruiken?”

Welk Teams-kanaal moet ik gebruiken? Binnen Microsoft Teams kun je verschillende kanalen gebruiken. In deze blog legt Sander Romeijn, onze Office 365-consultant, je de verschillen uit tussen de kanalen en weet je welke je wanneer kunt inzetten. Door gebruik te maken van het juiste kanaal zorg je ervoor dat data gedeeld is met de juiste personen en voorkom je onnodig werk in het verlenen van toegang.

Wat zijn kanalen binnen Teams?

Om te weten welk Teams-kanaal je moet gebruiken, is het handig om te weten wat een kanaal is. Binnen Teams vindt het samenwerken en de communicatie plaats in kanalen. Een kanaal is de plek waar een team berichten en bestanden kan delen. Verder is het de plek waar men andere apps kan ontsluiten. Afhankelijk van de doelgroep met wie je samenwerkt kun je kiezen om gebruik te maken van een bepaald type kanaal. 

Standaard, privé en gedeeld

Op dit moment zijn er drie verschillende type kanalen: standaard, privé en gedeeld.  In onderstaand team ‘Project X’ zien we het gebruik van de verschillende kanalen.  

General en Announcements zijn standaardkanalen, Communicatie is een gedeeld kanaal en gedeeld met het team van communicatie en Financials is een privékanaal en alleen gedeeld met bepaalde personen binnen het team.

Welk Teams-kanaal moet ik gebruiken?

Wat is een standaardkanaal? 

Een standaardkanaal is altijd toegankelijk voor alle teamleden. Toegang tot dit kanaal regel je dus op teamniveau. Iedereen kent het wel, het Algemeen of General kanaal dat altijd aanwezig is in een team. 

Normaal kunnen alle leden van een team standaard kanalen aanmaken. De beheerders van de organisatie kunnen dit echter aanpassen en beperken tot bepaalde rollen. 

Standaardkanalen kun je niet omzetten naar een ander type kanaal, je kunt er geen privé of gedeeld kanaal van maken. 

Wat is een privékanaal? 

Een privékanaal is niet gedeeld met alle leden van het team. Voor dit kanaal word je uitgenodigd om deel te nemen.  

Net als bij standaardkanaal heb je hier weer de mogelijkheid om berichten te posten en samen te werken in documenten. Het gebruiken van apps is echter beperkt. Je kunt bijvoorbeeld geen gebruik maken van de wiki, apps of de kanaalvergaderingen. 

Net als een standaardkanaal kun je ook een privékanaal niet omzetten naar standaard- of gedeeld kanaal. Verder is het niet mogelijk om een privékanaal te verplaatsen naar een ander team. 

Wat is een gedeeld kanaal? 

Een gedeeld kanaal is bedoeld om samen te werken met een groep mensen die binnen of buiten de organisatie werkzaam zijn. Het grote verschil met een standaardkanaal is dat je het gedeeld kanaal met een groep kunt delen. In het gedeelde kanaal kun je ook berichten delen, samenwerken in bestanden en werken met apps.  

De eigenaren van een team kunnen een gedeeld kanaal aanmaken en de eigenaren van het gedeelde kanaal kunnen leden toevoegen of het kanaal delen met een team/groep. 

Net als een standaard- en privékanaal kun je ook een gedeeld kanaal niet omzetten naar standaard of privékanaal.

Voorbeeld: wanneer gebruik je nu een gedeeld kanaal? 

Voor alle projecten binnen bedrijf X bestaat er een Teams-omgeving. De afdeling communicatie is bij al deze projecten betrokken. Om alle communicatiemedewerkers toe te voegen aan al deze projecten is niet handig. Daarom is er per project een gedeeld kanaal gemaakt en dit kanaal is gedeeld met het team van communicatie.  Zo regel je toegang voor de communicatiemedewerkers via het eigen communicatieteam in plaats van de toegang per project. 

Eigenschappen per kanaal 

In onderstaande tabel zie je de kenmerken per tabel zodat je snel de keuze kunt maken voor het juiste kanaal: 

Kenmerken Standaardkanaal Privékanaal Gedeeld kanaal 
Personen kunnen toegevoegd worden aan het kanaal zonder toegevoegd te worden aan het team NeeNeeJa
Lidmaatschap van het kanaal NeeJaJa
Kanaal kan direct met andere teams gedeeld worden NeeNeeJa
Kanaal kan met één klik gedeeld worden met alle leden van de standaard kanalen N.v.t.NeeJa
Gasten kunnen lid worden van het kanaal JaJaNee
Externe deelnemers kunnen lid worden van het kanaal (*door middel van B2B Direct connect)NeeNeeJa
Moderatie mogelijk JaNeeNee
Breakout-rooms mogelijk bij meetings JaNeeNee
Link naar het kanaal op te halen JaNeeNee
Elk kanaal heeft een eigen SharePoint Site NeeJaJa
Alle kanalen van deze soort hebben één gedeelde SharePoint Site JaNeeNee
Ingeplande meetings JaNeeJa
Het gebruik van Planner JaNeeNee
Bots, connectoren en berichtextensies JaNeeNee
TagsJaNeeNee
AnalyticsJaJaNee

Wil je meer weten of de verschillende Teams-kanalen of de technische inrichting? Neem dan contact met ons op:

“Your connection is not private!”

Een geldig certificaat plaatsen op je testomgeving in minder dan 5 minuten tijd? Het kan. En Alain de Klerk, een van onze Managing Directors & SharePoint Architect, legt het je snel uit:

“Bij de ontwikkeling van een nieuw IT-product of -oplossing maken we vaak van tevoren een proof-of-concept, een testomgeving en/of een acceptatie-omgeving. Op die manier kunnen we gebruikers al in een vroeg stadium betrekken bij het ontwikkelingsproces en hen om hun mening vragen.

In veel gevallen zie ik dat men aan gebruikers vraagt om de ‘SSL warning’ (of SSL-waarschuwing) te negeren op de testomgeving bij het testen van een webapplicatie. De ontwikkelaar of beheerder heeft simpelweg nog geen certificaat geïnstalleerd of gebruikt een zogenaamd self-signed certificate. En ik moet eerlijk bekennen dat ik zelf hier ook schuldig aan was.

Echter leren we gebruikers op deze manier een gedrag aan om waarschuwingen te negeren; die waarschuwing is er natuurlijk niet voor niets. Daarom laat ik zien dat je in 5 minuten, zonder kosten, een valide certificaat kan aanvragen bij een legitieme Certificate Authority. Dit gaan we doen met PowerShell en ACME; PoSh-ACME (https://poshac.me/docs/v4/).

De eerste stap is om een API Token aan te maken in Cloudflare. Wanneer je nog geen Cloudflare account hebt dan kan je deze gratis aanmaken.

De precieze stappen om een API Token aan te maken staan hier beschreven. Naast Cloudflare worden er ook tal van andere DNS-aanbieders ondersteund. De volledige lijst vind je hier

Vervolgens openen we een Microsoft PowerShell-venster en voeren we de volgende commando’s uit:

Het laatste commando opent de Windows Verkenner en toont de locatie waarin het certificaat is opgeslagen. Dit certificaat kun je vervolgens gebruiken om de applicatie in je testomgeving te beveiligen. En voilà… een valide certificaat op je testomgeving in minder dan 5 minuten tijd!”

Zo organiseer je individuele licenties met Microsoft PowerShell

Wij maken bij Etesian veelvuldig gebruik van Microsoft365 diensten en daarvoor zijn natuurlijk licenties nodig. Deze licenties kenden we voorheen toe aan iedere collega. Eind 2018 kondigde Microsoft aan dat we gebruik konden maken van groepslicenties (group based licensing).

Kortgezegd betekent dit dat je licenties kunt toekennen op basis van groepslidmaatschap in plaats van aan individuele gebruikers. Dit maakt het beheer van licenties een stuk gemakkelijker.

Echter waren we wel vergeten om onze individueel toegekende licenties netjes op te ruimen. Tijd voor een Microsoft PowerShell script! Het resultaat van het PowerShell script is een comma separated bestand zoals in onderstaand voorbeeld:

Zo organiseer je individuele licenties met Microsoft PowerShell

Dit bestand hebben we vervolgens gebruikt om onze licenties te organiseren.

Het PowerShell script is gebaseerd op het script dat door Microsoft zelf beschikbaar wordt gesteld. Tevens maken we dankbaar gebruik van de lijst die door Brad Wyatt beschikbaar wordt gesteld op zijn blog ‘The Lazy Administrator’ met vertalingen voor de producten.

Zo organiseer je individuele licenties met Microsoft PowerShell


Funtion Get-LicenseAssignmentInfo {
<#
.SYNOPSIS
This function will check if a license is assigned directly to a user, if the license is group based, or both
#>
param(
    [Parameter(Mandatory=$True, ValueFromPipeLine=$false)][Microsoft.Online.Administration.User]$User,
    [Parameter(Mandatory=$True, ValueFromPipeLine=$false)][string]$SkuId
)
BEGIN {
    [bool]$LicenseIsAssignedDirectly = $false;
    [bool]$LicenseIsGroupBased = $false;
    [string]$Sku = '';
}
PROCESS {
    #Retrieve the correct license from the user object
    [Array]$licenses = $User.Licenses | Where-Object {$_.AccountSkuId -eq $SkuId}
    if ($licenses.Count -eq 0) {
        throw "License could not be found"
    }
    elseif ($licenses.Count -gt 1) {
        throw "License found more than once"
    }
    else {
        #GroupsAssigningLicense contains a collection of IDs of objects assigning the license
        #This could be a group object or a user object (contrary to what the name suggests)
        #If the collection is empty, this means the license is assigned directly - this is the case for users who have never been licensed via groups in the past
        if ($licenses[0].GroupsAssigningLicense.Count -eq 0)
        {
            $LicenseIsAssignedDirectly = $true
            $LicenseIsGroupBased = $false
        }
        #If the collection contains the ID of the user object, this means the license is assigned directly
        #Note: the license may also be assigned through one or more groups in addition to being assigned directly
        if (($licenses[0].GroupsAssigningLicense | Where-Object {$_ -eq $user.ObjectId}).Count -gt 0) {
            $LicenseIsAssignedDirectly = $true
        }
        #If the collection contains at least one ID not matching the user ID this means that the license is inherited from a group.
        #Note: the license may also be assigned directly in addition to being inherited
        if (($licenses[0].GroupsAssigningLicense | Where-Object {$_ -ne $user.ObjectId}).Count -gt 0) {
            $LicenseIsGroupBased = $true;
        }
    }
    $Sku = $SkuId -split ":" | Select-Object -Last 1
    $SkuFriendlyName = $SkuFriendlyNames.Item($Sku)
}
END {
    return New-Object -Type PSObject -Property @{
        'User' = $User.UserPrincipalName
        'SkuId'= $SkuId
        'Sku' = $SkuFriendlyName
        'LicenseIsAssignedDirectly' = $LicenseIsAssignedDirectly
        'LicenseIsGroupBased' = $LicenseIsGroupBased
    }
  }
}
$SkuFriendlyNames = @{
"O365_BUSINESS_ESSENTIALS"           = "Office 365 Business Essentials"
"O365_BUSINESS_PREMIUM"              = "Office 365 Business Premium"
"DESKLESSPACK"                       = "Office 365 (Plan K1)"
"DESKLESSWOFFPACK"                   = "Office 365 (Plan K2)"
"LITEPACK"                           = "Office 365 (Plan P1)"
"EXCHANGESTANDARD"                   = "Office 365 Exchange Online Only"
"STANDARDPACK"                       = "Enterprise Plan E1"
"STANDARDWOFFPACK"                   = "Office 365 (Plan E2)"
"ENTERPRISEPACK"                     = "Enterprise Plan E3"
"ENTERPRISEPACKLRG"                  = "Enterprise Plan E3"
"ENTERPRISEWITHSCAL"                 = "Enterprise Plan E4"
"STANDARDPACK_STUDENT"               = "Office 365 (Plan A1) for Students"
"STANDARDWOFFPACKPACK_STUDENT"       = "Office 365 (Plan A2) for Students"
"ENTERPRISEPACK_STUDENT"             = "Office 365 (Plan A3) for Students"
"ENTERPRISEWITHSCAL_STUDENT"         = "Office 365 (Plan A4) for Students"
"STANDARDPACK_FACULTY"               = "Office 365 (Plan A1) for Faculty"
"STANDARDWOFFPACKPACK_FACULTY"       = "Office 365 (Plan A2) for Faculty"
"ENTERPRISEPACK_FACULTY"             = "Office 365 (Plan A3) for Faculty"
"ENTERPRISEWITHSCAL_FACULTY"         = "Office 365 (Plan A4) for Faculty"
"ENTERPRISEPACK_B_PILOT"             = "Office 365 (Enterprise Preview)"
"STANDARD_B_PILOT"                   = "Office 365 (Small Business Preview)"
"VISIOCLIENT"                        = "Visio Pro Online"
"POWER_BI_ADDON"                     = "Office 365 Power BI Addon"
"POWER_BI_INDIVIDUAL_USE"            = "Power BI Individual User"
"POWER_BI_STANDALONE"                = "Power BI Stand Alone"
"POWER_BI_STANDARD"                  = "Power-BI Standard"
"PROJECTESSENTIALS"                  = "Project Lite"
"PROJECTCLIENT"                      = "Project Professional"
"PROJECTONLINE_PLAN_1"               = "Project Online"
"PROJECTONLINE_PLAN_2"               = "Project Online and PRO"
"ProjectPremium"                     = "Project Online Premium"
"ECAL_SERVICES"                      = "ECAL"
"EMS"                                = "Enterprise Mobility Suite"
"RIGHTSMANAGEMENT_ADHOC"             = "Windows Azure Rights Management"
"MCOMEETADV"                         = "PSTN conferencing"
"SHAREPOINTSTORAGE"                  = "SharePoint storage"
"PLANNERSTANDALONE"                  = "Planner Standalone"
"CRMIUR"                             = "CMRIUR"
"BI_AZURE_P1"                        = "Power BI Reporting and Analytics"
"INTUNE_A"                           = "Windows Intune Plan A"
"PROJECTWORKMANAGEMENT"              = "Office 365 Planner Preview"
"ATP_ENTERPRISE"                     = "Exchange Online Advanced Threat Protection"
"EQUIVIO_ANALYTICS"                  = "Office 365 Advanced eDiscovery"
"AAD_BASIC"                          = "Azure Active Directory Basic"
"RMS_S_ENTERPRISE"                   = "Azure Active Directory Rights Management"
"AAD_PREMIUM"                        = "Azure Active Directory Premium"
"MFA_PREMIUM"                        = "Azure Multi-Factor Authentication"
"STANDARDPACK_GOV"                   = "Microsoft Office 365 (Plan G1) for Government"
"STANDARDWOFFPACK_GOV"               = "Microsoft Office 365 (Plan G2) for Government"
"ENTERPRISEPACK_GOV"                 = "Microsoft Office 365 (Plan G3) for Government"
"ENTERPRISEWITHSCAL_GOV"             = "Microsoft Office 365 (Plan G4) for Government"
"DESKLESSPACK_GOV"                   = "Microsoft Office 365 (Plan K1) for Government"
"ESKLESSWOFFPACK_GOV"                = "Microsoft Office 365 (Plan K2) for Government"
"EXCHANGESTANDARD_GOV"               = "Microsoft Office 365 Exchange Online (Plan 1) only for Government"
"EXCHANGEENTERPRISE_GOV"             = "Microsoft Office 365 Exchange Online (Plan 2) only for Government"
"SHAREPOINTDESKLESS_GOV"             = "SharePoint Online Kiosk"
"EXCHANGE_S_DESKLESS_GOV"            = "Exchange Kiosk"
"RMS_S_ENTERPRISE_GOV"               = "Windows Azure Active Directory Rights Management"
"OFFICESUBSCRIPTION_GOV"             = "Office ProPlus"
"MCOSTANDARD_GOV"                    = "Lync Plan 2G"
"SHAREPOINTWAC_GOV"                  = "Office Online for Government"
"SHAREPOINTENTERPRISE_GOV"           = "SharePoint Plan 2G"
"EXCHANGE_S_ENTERPRISE_GOV"          = "Exchange Plan 2G"
"EXCHANGE_S_ARCHIVE_ADDON_GOV"       = "Exchange Online Archiving"
"EXCHANGE_S_DESKLESS"                = "Exchange Online Kiosk"
"SHAREPOINTDESKLESS"                 = "SharePoint Online Kiosk"
"SHAREPOINTWAC"                      = "Office Online"
"YAMMER_ENTERPRISE"                  = "Yammer Enterprise"
"EXCHANGE_L_STANDARD"                = "Exchange Online (Plan 1)"
"MCOLITE"                            = "Lync Online (Plan 1)"
"SHAREPOINTLITE"                     = "SharePoint Online (Plan 1)"
"OFFICE_PRO_PLUS_SUBSCRIPTION_SMBIZ" = "Office ProPlus"
"EXCHANGE_S_STANDARD_MIDMARKET"      = "Exchange Online (Plan 1)"
"MCOSTANDARD_MIDMARKET"              = "Lync Online (Plan 1)"
"SHAREPOINTENTERPRISE_MIDMARKET"     = "SharePoint Online (Plan 1)"
"OFFICESUBSCRIPTION"                 = "Office ProPlus"
"YAMMER_MIDSIZE"                     = "Yammer"
"DYN365_ENTERPRISE_PLAN1"            = "Dynamics 365 Customer Engagement Plan Enterprise Edition"
"ENTERPRISEPREMIUM_NOPSTNCONF"       = "Enterprise E5 (without Audio Conferencing)"
"ENTERPRISEPREMIUM"                  = "Enterprise E5 (with Audio Conferencing)"
"MCOSTANDARD"                        = "Skype for Business Online Standalone Plan 2"
"PROJECT_MADEIRA_PREVIEW_IW_SKU"     = "Dynamics 365 for Financials for IWs"
"STANDARDWOFFPACK_IW_STUDENT"        = "Office 365 Education for Students"
"STANDARDWOFFPACK_IW_FACULTY"        = "Office 365 Education for Faculty"
"EOP_ENTERPRISE_FACULTY"             = "Exchange Online Protection for Faculty"
"EXCHANGESTANDARD_STUDENT"           = "Exchange Online (Plan 1) for Students"
"OFFICESUBSCRIPTION_STUDENT"         = "Office ProPlus Student Benefit"
"STANDARDWOFFPACK_FACULTY"           = "Office 365 Education E1 for Faculty"
"STANDARDWOFFPACK_STUDENT"           = "Microsoft Office 365 (Plan A2) for Students"
"DYN365_FINANCIALS_BUSINESS_SKU"     = "Dynamics 365 for Financials Business Edition"
"DYN365_FINANCIALS_TEAM_MEMBERS_SKU" = "Dynamics 365 for Team Members Business Edition"
"FLOW_FREE"                          = "Microsoft Flow Free"
"POWER_BI_PRO"                       = "Power BI Pro"
"O365_BUSINESS"                      = "Office 365 Business"
"DYN365_ENTERPRISE_SALES"            = "Dynamics Office 365 Enterprise Sales"
"RIGHTSMANAGEMENT"                   = "Rights Management"
"PROJECTPROFESSIONAL"                = "Project Professional"
"VISIOONLINE_PLAN1"                  = "Visio Online Plan 1"
"EXCHANGEENTERPRISE"                 = "Exchange Online Plan 2"
"DYN365_ENTERPRISE_P1_IW"            = "Dynamics 365 P1 Trial for Information Workers"
"DYN365_ENTERPRISE_TEAM_MEMBERS"     = "Dynamics 365 For Team Members Enterprise Edition"
"CRMSTANDARD"                        = "Microsoft Dynamics CRM Online Professional"
"EXCHANGEARCHIVE_ADDON"              = "Exchange Online Archiving For Exchange Online"
"EXCHANGEDESKLESS"                   = "Exchange Online Kiosk"
"SPZA_IW"                            = "App Connect"
"WINDOWS_STORE"                      = "Windows Store for Business"
"MCOEV"                              = "Microsoft Phone System"
"VIDEO_INTEROP"                      = "Polycom Skype Meeting Video Interop for Skype for Business"
"SPE_E5"                             = "Microsoft 365 E5"
"SPE_E3"                             = "Microsoft 365 E3"
"ATA"                                = "Advanced Threat Analytics"
"MCOPSTN2"                           = "Domestic and International Calling Plan"
"FLOW_P1"                            = "Microsoft Flow Plan 1"
"FLOW_P2"                            = "Microsoft Flow Plan 2"
"CRMSTORAGE"                         = "Microsoft Dynamics CRM Online Additional Storage"
"SMB_APPS"                           = "Microsoft Business Apps"
"MICROSOFT_BUSINESS_CENTER"          = "Microsoft Business Center"
"DYN365_TEAM_MEMBERS"                = "Dynamics 365 Team Members"
"STREAM"                             = "Microsoft Stream Trial"
"EMSPREMIUM"                         = "ENTERPRISE MOBILITY + SECURITY E5"
}
#Connect-MsolService

$licenses = @()
 

#find all users and list all licenses
Get-MsolUser -All `
    | Where-Object {$_.UserPrincipalName -like '*etesian.nl'} `
    | Sort-Object UserPrincipalName `
    | ForEach-Object {

    $user = $_;
    $user.Licenses | Foreach-Object {

    $licenseAssignedInformation = LicenseAssignmentInfo -User $user -SkuId $_.AccountSkuId

    $licenses += $licenseAssignedInformation

    }

}

#Output the licenses to a CSV file
$licenses | Select-Object User, SkuId, Sku, LicenseIsAssignedDirectly, LicenseIsGroupBased | Export-Csv "C:\Temp\Licenses.csv" -NoTypeInformation -Delimiter ';'

Meer weten, neem dan contact met ons op!

Je website beveiligen met SRI en CSP

Het internet, en het name het World Wide Web (www), was nooit ontworpen met het oog op veiligheid. Alle aanvullende veiligheidsprotocollen die we kennen zijn eigenlijk later toegevoegd. Zo is de HTTPS-verbinding die we kennen als ‘het groene slotje’ pas de laatste jaren gemeengoed geworden. Tegenwoordig zijn er vele andere manieren om je website te beveiligen.

Kwaadwillenden vinden steeds nieuwe manieren om hun doel te bereiken. Daarop worden steeds nieuwe manieren gevonden om dit te mitigeren. We zien de laatste jaren een opkomst van JavaScript, Single Page Applications (SPA’s) en FrontEnd frameworks zoals Angular en React om snelle, interactieve en mooie websites en webapplicaties te bouwen. Vanzelfsprekend dienen deze technieken op een juiste en vooral veilige manier toegepast te worden. Echter zien we dat dit nog regelmatig misgaat. Het meest sprekende voorbeeld hiervan is de campagnewebsite van voormalige president Donald Trump. Deze bevatte een dusdanig groot ‘lek’ dat verregaande consequenties had kunnen hebben indien dit misbruikt zou zijn. Beveiligingsonderzoeker Troy Hunt heeft er deze mooie blogpost aan gewijd.

In deze blog beschrijven we twee technieken om je website te beveiligen, namelijk Subresouce Integritity (SRI) en Content Security Policies (CSP). Deze technieken zijn de afgelopen jaren ontwikkeld en worden momenteel ondersteund door het overgrote merendeel van de browsers zoals Firefox, Edge, Chrome, Opera en Safari. Helaas zien we dat deze technieken nog niet consequent worden geïmplementeerd in websites en webapplicaties.

Subresource Integrity (SRI)

Stel je voor dat je een nieuwe website maakt en hiervoor wil je functionaliteit gebruiken die door een derde partij beschikbaar wordt gemaakt, bijvoorbeeld voor een nieuwsbrief. Met JavaScript kan dat vaak eenvoudig door het opnemen van een stukje code zoals in het voorbeeld hieronder:

<script src="https://www.
SomeOtherParty.com/NewsLetter/embed.js"
type="text/javascript"></script>

Zoals je kunt zien maken we gebruik van een JavaScript bestand genaamd embed.js afkomstig van SomeOtherParty. Maar wat kan er nu gebeuren wanneer SomeOtherParty mijn bedrijf niet gezind is, of wanneer SomeOtherParty wordt gehackt? Dan kan het bestand embed.js worden
misbruikt om slechte code uit te voeren zoals een keylogger of cryptominer. Iedere bezoeker van jouw website zou dan worden blootgesteld aan deze slechte code zonder dat jij het door kan hebben.

Met de mitigerende maatregel SRI creëer je een digitale vingerafdruk van een bestand. Er wordt een cryptografische berekening uitgevoerd en op het moment dat het bestand zou wijzigen in de toekomst wordt voorkomen dat de gewijzigde code wordt uitgevoerd. Voor het genereren van deze digitale vingerafdruk zijn talloze websites en applicaties beschikbaar. Ik gebruik meestal de SRI Generator van Report-URI: https://report-uri.com/home/sri_hash

<script
src="https://www.SomeOtherParty.com/NewsLetter/embed.js"
type="text/javascript" integrity="sha256-
z2gyg8OpoUm1c8wqrYKqR63Hm87PC5MTa6NwpzDMEJ0= sha384-
Bnd++T0hmJJIB1RlfM20nAZfWAamM5jM8iQ/PMkQnUibNc1f14J2gqS9YQ9xS
G3q sha512-2URiUcHGmY2tyMuEhs/cYmsnkDyjSZF6DgtPiHy+N2wProrZssl9UxhBp1g0X
mq9w/P2QM6zbQOqgVB9xqwTSQ==></script>

Het gebruik van SRI heeft wel consequenties voor je website. Wanneer SomeOtherParty bijvoorbeeld besluit om een nieuwe release van hun nieuwsbrief functionaliteit aan te bieden, kan dit gevolgen hebben voor de functionaliteit op jouw eigen website.

Content Security Policies (CSP)

Een andere maatregel om je website of webapplicatie te beveiligen tegen slechte code is door gebruik te maken van zogenaamde Content Security Policies (of CSPs). Met een CSP kan worden bepaald welke bronnen worden vertrouwd als bron voor afbeeldingen, JavaScript code, stijl-bestanden, etc. CSP is geen alternatief of vervanging voor SRI. Door beide technieken te combineren maak je het kwaadwillenden al zeer moeilijk om slechte code uit te voeren op jouw website. Zo biedt CSP een prima eerste defensie-linie tegen Cross Script Scripting (XSS).

Een CSP begint met een header, een stukje additionele informatie, die door de webserver wordt meegestuurd naar de bezoeker van de website. Bijvoorbeeld:

Content-Security-Policy: default-src 'none'; script-src
'self' https://www.SomeOtherParty.com

Deze header beschrijft dat (Java)script bestanden enkel vertrouwd worden indien deze geladen worden vanuit de website zelf (script-src 'self') of vanuit SomeOtherParty. Andere JavaScript bestanden worden niet vertrouwd en dus niet uitgevoerd. Net zoals bij SRI zijn er websites en applicaties beschikbaar om deze CSP header te genereren, waaronder https://report-uri.com/home/generate.

Tot slot

De beschreven technieken SRI en CSP zijn geen silver bullit om je website te beveiligen, maar vormen een goede aanvulling op de reeds bestaande maatregelen die je waarschijnlijk al getroffen hebt. Wil je meer weten over SRI, CSP of over (cyber)security in het algemeen, neem dan gerust contact met ons op.