Personal Plan in Microsoft Planner

Bisher unterstützte Microsoft Planner zwei Arten von Plänen:

  • Gruppenplan
    Wird mit einer Microsoft 365 Gruppe verbunden und alle Mitglieder der Gruppe haben Zugriff auf den Plan. Eine Microsoft 365 Gruppe kann mehrere Pläne inkludieren.

  • Lightweight Plan
    Ein Lightweight Plan ist ein eingeschränkter Plan ohne Microsoft 365 Gruppe und kann über Code / PowerShell erstellt werden. Der Plan wird an einen Roster Container gebunden. Ein Roster Container kann jeweils nur einen Plan inkludieren. Sind in dem Plan keine Mitglieder mehr löscht das System den Roster Container und Plan. Ein Lightweight Plan kann später an keine Microsoft 365 Gruppe angebunden werden.

Neu gibt es eine dritte Art: Personal Plans


Informationen über Personal Plan

Ein Personal Plan ist an eine Einzelperson in der Organisation gebunden. Der Plan unterstützt keine weiteren Mitglieder und kann dadurch mit keinen anderen Personen geteilt werden.
Im Unterschied zu Lightweight Plan kann ein Personal Plan nachträglich an eine Microsoft 365 Gruppe angebunden werden, wenn zb eine Person die Organisation verlässt. Einmal mit einer Microsoft 365 Gruppe verbunden, kann ein Plan nachträglich nicht mehr zu einem Personal Plan werden.

Was solltest du noch über Personal Plans kennen?

  • Ein Personal Plan inkludiert keine Einstellungen. Auswirkungen sind Umbenennung des Plans ist nicht möglich, Benutzer kann den Plan nicht löschen,…
  • Personal Plan unterstützt keine Kommentare in Tasks
  • Personal Plan unterstützt keinen Upload von Dokumenten
  • Personal Plan kann nicht geteilt werden
  • Ein Personal Plan wird gelöscht, sobald das Konto von seinem Besitzer gelöscht wird
  • Ein Personal Plan ist an eine bestehende Microsoft 365 Gruppe übertragbar, nicht an eine andere Person. Alle Mitglieder der Gruppe erhalten Zugriff auf den Plan.


Erstellung von neuem Personal Plan

Die Erstellung von einem Personal Plan erfolgt über PowerShell und Microsoft Graph. Der Plan wird an einen Planner User Container gebunden. Der User Container ist wichtig damit es die richtige Art von Plan erstellt. Ohne der Angabe für User Container würde das System einen Plan mit M365 Gruppe erstellen. Neben User gibt es noch Group, Roster, Project und DriveItem Container.

Mit PowerShell benötigt es für Microsoft Graph die Berechtigung Tasks.ReadWrite (Delegated) oder Tasks.ReadWrite.All (Application). Es muss ein neuer Planner Plan erstellt werden.

Bedenke für die Berechtigungen:

  • Delegated
    Dein Konto ist berechtigt einen Personal Plan für das eigene Konto zu erstellen. Die Erstellung für ein anderes Konto wird verweigert.

  • Application
    Für die Berechtigung musst du eine Azure App Registration einsetzen. Über die App kannst du für andere Konten Personal Plans erstellen. Das Konto ist Besitzer des Plans.

In meinem Beispiel erstelle ich über Create plannerPlan einen Personal Plan für mein eigenes Konto.

PowerShell
Import-Module Microsoft.Graph.Authentication
Connect-MgGraph -Scopes Tasks.ReadWrite

$UPN = "<UserPrincipalName>"
$Body = @"
{
  "container": {
    "url": "https://graph.microsoft.com/beta/users/$UPN"
  },
  "title": "TA Personal Plan"
}
"@

$Url = "https://graph.microsoft.com/beta/planner/plans"
$PersonalPlanResult = Invoke-MgGraphRequest -Method POST -Uri $Url -Body $Body -ContentType "application/json"  
$PersonalPlanResult


Der Plan wurde mit ID aR8o7jof-UyicwSN2AZvyJgAEbWQ erstellt.

PowerShell


Ich öffne Planner im Web … und finde den Plan nicht. Selbst nach 24 Stunden ist der Plan nicht in der Ansicht aller Pläne.
Nach einer Analyse gehe ich davon aus der Plan benötigt für die Listung einen ersten Aufruf. Das System führt den Vorgang während der Erstellung nicht automatisch durch. Über zwei Workarounds ist es möglich den Plan einzublenden.

Personal Plan über Planner im Web anzeigen (Workaround)

Ein Plan hat in Planner im Web folgendes URL-Format:

Ich versuche den Plan direkt über die ID öffnen, ohne Angabe einer Gruppe:

Planner öffnet meinen gesuchten Plan, mit all seinen oben beschriebenen Einschränkungen. Einmal geöffnet bleibt er in Planner.

Personal Plan in Planner
Personal Plan in Planner


Personal Plan über PowerShell anzeigen (Workaround)

Beachtet man die URL von zuvor im Web hat mir Planner eine Gruppen ID VyvrBNrdHECLopziVThfP5gAB17- ergänzt.

Eine Analyse zeigt die ID VyvrBNrdHECLopziVThfP5gAB17- ist in der Abfrage Get plannerUser inkludiert.

PowerShell
$Url = "https://graph.microsoft.com/beta/users/$UPN/planner"
$UserPlans = Invoke-MgGraphRequest -Method GET -Uri $Url  -ContentType "application/json"  
$UserPlans

PowerShell

In der Dokumentation ist vermerkt es handelt sich bei der ID um ein plannerUser Object. Heute unterstützt die ID nur Veränderungen an einem Plan für das eigene Konto. So lässt sich ein Personal Plan anpinnen oder in die zuletzten genutzten Pläne einfügen. Das kann für die Anzeige von einem fehlenden Plan helfen.

In meinem Beispiel aktualisiere ich den letzten Zugriff. Damit rutscht der Plan in der History ganz nach oben und wird in Planner im Web eingeblendet.

PowerShell
$DateTime = (Get-Date).ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ss.fffZ')
$Body = @"
{
  "recentPlanReferences": 
    {  
        "$($PersonalPlanResult.id)": {
        "@odata.type": "#microsoft.graph.plannerRecentPlanReference",
        "lastAccessedDateTime": "$DateTime",
        "planTitle": "$($PersonalPlanResult.title)"
        }  
    }
}
"@

$Url = "https://graph.microsoft.com/beta/me/planner"
$Header = @{ "If-Match" = $UserPlans.'@odata.etag'  }
Invoke-MgRestMethod -Method PATCH -Uri $Url -Body $Body -Headers $Header -ContentType "application/json" 


30 bis 60 Sekunden warten, und der Personal Plan wird in Planner im Web angezeigt. 👍


Finden von Personal Plan

In Dokumentationen beschreibt Microsoft bisher nicht wie es möglich ist einen Personal Plan zu finden. Es gibt eine Dokumentation über Auflistung von allen Plänen pro Gruppe. Mit einer Anpassung auf User funktioniert es.

PowerShell
$Url = "https://graph.microsoft.com/beta/users/$UPN/planner/plans"
$AllUserPlans = Invoke-MgGraphRequest -Method GET -Uri $Url  -ContentType "application/json"  
$AllUserPlans


Die Ergebnisse zeigen alle von dem Konto erstellten Pläne. Wurde ein Personal Plan für andere Konten erstellt, wird der Plan ebenfalls in den Ergebnissen gelistet.
Nun noch die Filterung nach Personal Plan. Hier hat Microsoft noch einen Fehler während der Erstellung. Laut Dokumentation sollte der Typ des Plans User sein. Heute vermerkt das System noch den Wert unknownFutureValue. Mit unknownFutureValue ist es beim Ergebnis eine Mischung von über Loop erstellte Pläne, Lightweight Pläne und Personal Pläne. Die Filterung der Container-URL hilft für die Eingrenzung. Es zeigt alle von meinem Konto erstellten Personal Plans. Für meine Demo erstellte ich diverse Pläne und fand die Pläne später nicht in Planner im Web.

PowerShell
$AllPersonalPlans = $AllUserPlans.value | ?{$_.container.url -like "*users*" }
$AllPersonalPlans | select title,id,container | sort title

PowerShell

Löschen von Personal Plan

Durch die Abfrage von vorhin sind die IDs der Pläne bekannt. Die ID wird für das Löschen von einem Plan benötigt. Löschen von einem Plan erfolgt in zwei Schritten.

  1. Du fragst die Werte des Plans ab. In der Abfrage ist ein aktueller ETag inkludiert.
  2. Der ETag muss für den Löschantrag als Bestätigung mitgesendet werden. Füge den ETag in einen Header ein. Der Plan wird gelöscht. Ohne aktuellen ETag verweigert es das System.
PowerShell
$PlannerPlanID = "RIgdnzReL0upbluhiEUS8ZgACLnX"
$url = "https://graph.microsoft.com/beta/planner/plans/$PlannerPlanID"
$PlannerPlanResult = Invoke-MgGraphRequest -Method GET -Uri $Url -ContentType "application/json"  

$Header = @{ "If-Match" = $PlannerPlanResult.'@odata.etag' }
Invoke-MgRestMethod -Method DELETE -Uri $Url -Headers $Header -ContentType "application/json" 


Personal Plan mit Microsoft 365 Gruppe verbinden

Als letzten Schritt kann es bei einem Austritt erforderlich sein einen Personal Plan an eine M365 Gruppe anzubinden. Dafür muss der Personal Plan Container zu einer Gruppe verschoben werden. Die Dokumentation moveToContainer beschreibt den Vorgang.

PowerShell
$PlannerPlanID = "y45XIqCdPkGIYHYFUUhueJgAEIBD"
$M365GroupID = "374767f3-111e-47c4-8ac8-0ccda91779fb"

$Url = "https://graph.microsoft.com/beta/planner/plans/$PlannerPlanID"
$PlannerPlanResult = Invoke-MgGraphRequest -Method GET -Uri $Url -ContentType "application/json"  

$Body = @"
{
    "container": {
        "containerId": "$M365GroupID",
        "type": "group"
    }
}
"@

$Header = @{ "If-Match" = $PlannerPlanResult.'@odata.etag' }
$Url = "https://graph.microsoft.com/beta/planner/plans/$PlannerPlanID/moveToContainer"
$MoveResult = Invoke-MgGraphRequest -Method POST -Uri $Url -Body $Body -Headers $Header -ContentType "application/json"  
$MoveResult 


Das Ergebnis zeigt der Personal Plan ist nun Teil von einer Gruppe. Die Aktualisierung in Planner im Web kann eine Minute dauern. Damit ist der Vorgang abgeschlossen und alle Mitglieder der Gruppe können auf den Plan zugreifen.

PowerShell
Share
Avatar-Foto

Tobias Asböck

Tobias ist ein Senior System Engineer mit rund 10 Jahren Berufserfahrung für Microsoft 365 Produkte wie SharePoint Online, OneDrive for Business, Teams Collaboration, Entra ID, Information Protection, Universal Print und Microsoft 365 Lizenzierung. Aus der Vergangenheit kennt er über einen Zeitraum von 15+ Jahren die Planung, Administration und den Betrieb von SharePoint Server Umgebungen. Tobias ist ein PowerShell Scripter mit Zertifizierungen für Microsoft 365 Produkte. In seiner Freizeit beschäftigt sich Tobias mit Aktualisierungen in der M365-Welt, ist mit seinem Rennvelo unterwegs und anderen sportlichen Aktivitäten beschäftigt. Bei Fragen kontaktiere mich über LinkedIn oder [email protected].

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert