Six months after their original attempt, Microsoft seems ready to relaunch rosters or lightweight plans (MC279089, August 18) by enabling the feature “on Graph for all tenants starting in mid-September and expect to complete by mid-October.” The mention of the Graph is a little confusing because of the use of PowerShell to disable or enable rosters (see below). It means that Microsoft will enable lightweight plans by lighting up the necessary Graph API in Office 365 tenants.
Lightweight plans are Planner plans without Microsoft 365 Groups. Originally, Planner had a 1:1 relationship with Groups and each plan had an associated group. Teams then broke the 1:1 connection by supporting multiple plans per team (group). Lightweight plans have their own list of members (the roster). Members have Azure AD accounts in the tenant. The plans themselves do not exist as Azure AD objects. Instead, Planner manages lightweight plans like other (group-enabled) plans using the same Planner browser interface (references to resources available to group-enabled plans are suppressed). Planner deletes lightweight plans automatically upon the removal of the last member.
Using Fluid-Based Lightweight Plans in Teams Meetings
Microsoft says that the only way to create lightweight plans is through the Graph API for Planner, which Microsoft is extending to deal with roster containers. This brings me neatly to how Microsoft will use lightweight plans. In MC279089, a reference is made to New hybrid work innovations (June 2021), where Microsoft CVP Jared Spataro discussed new features coming to Microsoft 365, including the Fluid Framework.
We know that Teams will soon support fluid components in chat. The natural connection between lightweight plans and Teams is in meetings, specifically to allowing meeting organizers to add a fluid component to track tasks assigned during meetings (the meeting participants form the plan roster).
Fluid components already include a task list, but the tasks captured in this component exist only in the fluid file created in the originator’s OneDrive for Business account. The advantage of linking a fluid component to a Planner lightweight plan is that the tasks captured in the lightweight plan can synchronize with the rest of the Microsoft 365 task ecosystem and be available in apps like To Do or, perhaps more importantly, the Teams Tasks app. Synchronization should mean that the tasks assigned during meetings show up under the Assigned to Me list within My Tasks in the Tasks app. We’ll have to see how the implementation works in Teams. I imagine that the same component will show up in Outlook meetings later (OWA first and later Outlook desktop using the Edge WebView2 component).
Planner’s Ongoing Poor PowerShell Support
In my March post, I commented about the poor support of PowerShell by Planner. Things haven’t improved very much since. Why Planner goes through the current rigmarole instead of supporting the distribution of the PowerShell module via the PowerShell Gallery is beyond me.
If you want to disable rosters (or turn them back on later), you must:
Download a Zip file containing a PowerShell module file (psm1) from Microsoft.
Unzip the file to somewhere suitable and block the script module and DLL files.
Adjust the execution policy for the workstation to allow execution of the downloaded files.
Import the module file (remember to include the full location of the psm1) into a PowerShell session.
Check the Planner configuration with the Get-PlannerConfiguration cmdlet.
Adjust the roster setting with the Set-PlannerConfiguration cmdlet.
For instance, here’s what I did to load the files, examine the configuration, and update the configuration to disable the creation of rosters.
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope Process
Execution Policy Change
The execution policy helps protect you from scripts that you do not trust. Changing the execution policy might expose
you to the security risks described in the about_Execution_Policies help topic at
https:/go.microsoft.com/fwlink/?LinkID=135170. Do you want to change the execution policy?
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "N"): y
Import-Module "c:\temp\plannertenantadmin\plannertenantadmin.psm1"
Get-PlannerConfiguration
AllowRosterCreation AllowTenantMoveWithDataLoss AllowPlannerMobilePushNotifications AllowCalendarSharing
------------------- --------------------------- ----------------------------------- --------------------
True False True True
Set-PlannerConfiguration -AllowRosterCreation $False
Exporting Planner User Data
The Planner script module contains the Export-PlannerUserContent cmdlet, which administrators can use to export Planner data for a selected user. For example, to export my Planner data, I ran:
The cmdlet took 35 seconds to export 13.7 MB of Planner data from 51 plans. The data for each plan is in a separate JSON-format file (Figure 1) containing details of the tasks and other information used by Planner.
Figure 1: Planner data exported for a user
MVP Alex Holmeset has written about using the Planner Graph API to extract data for users and import the data into accounts in a new tenant. Maybe the existence of this capability will make moving Planner data around just a tad easier, even if there’s no equivalent import cmdlet (yet) to process the JSON files.
Moving Forward
Lightweight plans open new possibilities for any app which needs to capture and manage tasks for a small set of users. I’ve been a happy user of Planner for years and use the app to manage the development and progress of the Office 365 for IT Pros eBook. The Tasks app in Teams delivers a nice overhead of personal (To Do/Outlook) and organizational (Planner) tasks. Adding tasks assigned in meetings managed through lightweight plans should be a useful extension. We’ll see when the functionality turns up in apps.
Here too, able to create ID but what then? Does it show up in Planner? Besides ID no other info can be added, like a title, description and so on. How to reveal to the user then?
I think we need to wait and see how Microsoft uses these lightweight plans to understand how other applications might exploit their capabilities. Planner just seems to take forever to get anything done…
Loading...
Do you see a way to list all roster containers created/existing in a tenant?
//UserId of the user who shall have access to the planner
New-MgPlannerRosterMember -PlannerRosterId “example-y62a1r9Wjk6lv1xxxxxxxxxxxxxxxxx” -UserId “e00ecbac-xxxx-xxxx-xxxx-xxxxxxxxxxx”
$param = @{
Container = @{
ContainerId = “example-y62a1r9Wjk6lv1xxxxxxxxxxxxxxxxx”
Type = “roster”
}
Title = “Name of the Roster Planner”
}
New-MgPlannerPlan -BodyParameter $param
//returns the ID of the new Planner
//example-e00ecbac-xxxx-xxxx-xxxx-xxxxxxxxxxx
Plan shows then in the Planner App for the assigned user. No Group-Channel shown below the Plan.
Additional users can be invited and the Plan can be managed from the standard Planner App UI.
{"id":null,"mode":"button","open_style":"in_modal","currency_code":"EUR","currency_symbol":"\u20ac","currency_type":"decimal","blank_flag_url":"https:\/\/office365itpros.com\/wp-content\/plugins\/tip-jar-wp\/\/assets\/images\/flags\/blank.gif","flag_sprite_url":"https:\/\/office365itpros.com\/wp-content\/plugins\/tip-jar-wp\/\/assets\/images\/flags\/flags.png","default_amount":100,"top_media_type":"featured_image","featured_image_url":"https:\/\/office365itpros.com\/wp-content\/uploads\/2022\/11\/cover-141x200.jpg","featured_embed":"","header_media":null,"file_download_attachment_data":null,"recurring_options_enabled":true,"recurring_options":{"never":{"selected":true,"after_output":"One time only"},"weekly":{"selected":false,"after_output":"Every week"},"monthly":{"selected":false,"after_output":"Every month"},"yearly":{"selected":false,"after_output":"Every year"}},"strings":{"current_user_email":"","current_user_name":"","link_text":"Virtual Tip Jar","complete_payment_button_error_text":"Check info and try again","payment_verb":"Pay","payment_request_label":"Office 365 for IT Pros","form_has_an_error":"Please check and fix the errors above","general_server_error":"Something isn't working right at the moment. Please try again.","form_title":"Office 365 for IT Pros","form_subtitle":null,"currency_search_text":"Country or Currency here","other_payment_option":"Other payment option","manage_payments_button_text":"Manage your payments","thank_you_message":"Thank you for supporting the work of Office 365 for IT Pros!","payment_confirmation_title":"Office 365 for IT Pros","receipt_title":"Your Receipt","print_receipt":"Print Receipt","email_receipt":"Email Receipt","email_receipt_sending":"Sending receipt...","email_receipt_success":"Email receipt successfully sent","email_receipt_failed":"Email receipt failed to send. Please try again.","receipt_payee":"Paid to","receipt_statement_descriptor":"This will show up on your statement as","receipt_date":"Date","receipt_transaction_id":"Transaction ID","receipt_transaction_amount":"Amount","refund_payer":"Refund from","login":"Log in to manage your payments","manage_payments":"Manage Payments","transactions_title":"Your Transactions","transaction_title":"Transaction Receipt","transaction_period":"Plan Period","arrangements_title":"Your Plans","arrangement_title":"Manage Plan","arrangement_details":"Plan Details","arrangement_id_title":"Plan ID","arrangement_payment_method_title":"Payment Method","arrangement_amount_title":"Plan Amount","arrangement_renewal_title":"Next renewal date","arrangement_action_cancel":"Cancel Plan","arrangement_action_cant_cancel":"Cancelling is currently not available.","arrangement_action_cancel_double":"Are you sure you'd like to cancel?","arrangement_cancelling":"Cancelling Plan...","arrangement_cancelled":"Plan Cancelled","arrangement_failed_to_cancel":"Failed to cancel plan","back_to_plans":"\u2190 Back to Plans","update_payment_method_verb":"Update","sca_auth_description":"Your have a pending renewal payment which requires authorization.","sca_auth_verb":"Authorize renewal payment","sca_authing_verb":"Authorizing payment","sca_authed_verb":"Payment successfully authorized!","sca_auth_failed":"Unable to authorize! Please try again.","login_button_text":"Log in","login_form_has_an_error":"Please check and fix the errors above","uppercase_search":"Search","lowercase_search":"search","uppercase_page":"Page","lowercase_page":"page","uppercase_items":"Items","lowercase_items":"items","uppercase_per":"Per","lowercase_per":"per","uppercase_of":"Of","lowercase_of":"of","back":"Back to plans","zip_code_placeholder":"Zip\/Postal Code","download_file_button_text":"Download File","input_field_instructions":{"tip_amount":{"placeholder_text":"How much would you like to tip?","initial":{"instruction_type":"normal","instruction_message":"How much would you like to tip? Choose any currency."},"empty":{"instruction_type":"error","instruction_message":"How much would you like to tip? Choose any currency."},"invalid_curency":{"instruction_type":"error","instruction_message":"Please choose a valid currency."}},"recurring":{"placeholder_text":"Recurring","initial":{"instruction_type":"normal","instruction_message":"How often would you like to give this?"},"success":{"instruction_type":"success","instruction_message":"How often would you like to give this?"},"empty":{"instruction_type":"error","instruction_message":"How often would you like to give this?"}},"name":{"placeholder_text":"Name on Credit Card","initial":{"instruction_type":"normal","instruction_message":"Enter the name on your card."},"success":{"instruction_type":"success","instruction_message":"Enter the name on your card."},"empty":{"instruction_type":"error","instruction_message":"Please enter the name on your card."}},"privacy_policy":{"terms_title":"Terms and conditions","terms_body":null,"terms_show_text":"View Terms","terms_hide_text":"Hide Terms","initial":{"instruction_type":"normal","instruction_message":"I agree to the terms."},"unchecked":{"instruction_type":"error","instruction_message":"Please agree to the terms."},"checked":{"instruction_type":"success","instruction_message":"I agree to the terms."}},"email":{"placeholder_text":"Your email address","initial":{"instruction_type":"normal","instruction_message":"Enter your email address"},"success":{"instruction_type":"success","instruction_message":"Enter your email address"},"blank":{"instruction_type":"error","instruction_message":"Enter your email address"},"not_an_email_address":{"instruction_type":"error","instruction_message":"Make sure you have entered a valid email address"}},"note_with_tip":{"placeholder_text":"Your note here...","initial":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"empty":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"not_empty_initial":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"saving":{"instruction_type":"normal","instruction_message":"Saving note..."},"success":{"instruction_type":"success","instruction_message":"Note successfully saved!"},"error":{"instruction_type":"error","instruction_message":"Unable to save note note at this time. Please try again."}},"email_for_login_code":{"placeholder_text":"Your email address","initial":{"instruction_type":"normal","instruction_message":"Enter your email to log in."},"success":{"instruction_type":"success","instruction_message":"Enter your email to log in."},"blank":{"instruction_type":"error","instruction_message":"Enter your email to log in."},"empty":{"instruction_type":"error","instruction_message":"Enter your email to log in."}},"login_code":{"initial":{"instruction_type":"normal","instruction_message":"Check your email and enter the login code."},"success":{"instruction_type":"success","instruction_message":"Check your email and enter the login code."},"blank":{"instruction_type":"error","instruction_message":"Check your email and enter the login code."},"empty":{"instruction_type":"error","instruction_message":"Check your email and enter the login code."}},"stripe_all_in_one":{"initial":{"instruction_type":"normal","instruction_message":"Enter your credit card details here."},"empty":{"instruction_type":"error","instruction_message":"Enter your credit card details here."},"success":{"instruction_type":"normal","instruction_message":"Enter your credit card details here."},"invalid_number":{"instruction_type":"error","instruction_message":"The card number is not a valid credit card number."},"invalid_expiry_month":{"instruction_type":"error","instruction_message":"The card's expiration month is invalid."},"invalid_expiry_year":{"instruction_type":"error","instruction_message":"The card's expiration year is invalid."},"invalid_cvc":{"instruction_type":"error","instruction_message":"The card's security code is invalid."},"incorrect_number":{"instruction_type":"error","instruction_message":"The card number is incorrect."},"incomplete_number":{"instruction_type":"error","instruction_message":"The card number is incomplete."},"incomplete_cvc":{"instruction_type":"error","instruction_message":"The card's security code is incomplete."},"incomplete_expiry":{"instruction_type":"error","instruction_message":"The card's expiration date is incomplete."},"incomplete_zip":{"instruction_type":"error","instruction_message":"The card's zip code is incomplete."},"expired_card":{"instruction_type":"error","instruction_message":"The card has expired."},"incorrect_cvc":{"instruction_type":"error","instruction_message":"The card's security code is incorrect."},"incorrect_zip":{"instruction_type":"error","instruction_message":"The card's zip code failed validation."},"invalid_expiry_year_past":{"instruction_type":"error","instruction_message":"The card's expiration year is in the past"},"card_declined":{"instruction_type":"error","instruction_message":"The card was declined."},"missing":{"instruction_type":"error","instruction_message":"There is no card on a customer that is being charged."},"processing_error":{"instruction_type":"error","instruction_message":"An error occurred while processing the card."},"invalid_request_error":{"instruction_type":"error","instruction_message":"Unable to process this payment, please try again or use alternative method."},"invalid_sofort_country":{"instruction_type":"error","instruction_message":"The billing country is not accepted by SOFORT. Please try another country."}}}},"fetched_oembed_html":false}
Hey Tony, thx for this nice Article. Right now we are looking into this roster thing. Did you already mange to use it ?
What I already achieve with the PowerShell graph sdk , create a new roster plan via
New-MgPlannerRoster
add a user to to it:
New-MgPlannerRosterMember -PlannerRosterId yY9cSi1uqUmbOCH5seljn5YXXXXX -UserId 8fb37c8a-4e35-4dde-bd95-XXXXXXXXXXXX
But now I am stuck how to use this thing with the planner app
Thx for your help
Christoph
I haven’t used the roster plans yet. I’m waiting to hear from Microsoft that they’re ready for prime time.
Okay Thx for the reply.
Looks like the entire world is waiting, at least I could not find a useful source how to use the roster / lightweight plans.
Have a nice day
Christoph
any update on this ? we are unable to create roasterid, and so unable to add user to a roaster …
Here too, able to create ID but what then? Does it show up in Planner? Besides ID no other info can be added, like a title, description and so on. How to reveal to the user then?
I think we need to wait and see how Microsoft uses these lightweight plans to understand how other applications might exploit their capabilities. Planner just seems to take forever to get anything done…
Do you see a way to list all roster containers created/existing in a tenant?
Not so far. The API documentation https://docs.microsoft.com/en-us/graph/api/resources/planner-overview?view=graph-rest-1.0 discusses plans as owned by Microsoft 365 groups. Still waiting.
With PowerShell
you can create Roster Container, Add users to the Container and create a Plan for the container. Find details in the PS code below
Connect-Graph
Select-MgProfile -Name “beta”
$params = @{
“@odata.type” = “#microsoft.graph.plannerRoster”
}
New-MgPlannerRoster -BodyParameter $params
//returns
//Id
//–
//example-y62a1r9Wjk6lv1xxxxxxxxxxxxxxxxx
//UserId of the user who shall have access to the planner
New-MgPlannerRosterMember -PlannerRosterId “example-y62a1r9Wjk6lv1xxxxxxxxxxxxxxxxx” -UserId “e00ecbac-xxxx-xxxx-xxxx-xxxxxxxxxxx”
$param = @{
Container = @{
ContainerId = “example-y62a1r9Wjk6lv1xxxxxxxxxxxxxxxxx”
Type = “roster”
}
Title = “Name of the Roster Planner”
}
New-MgPlannerPlan -BodyParameter $param
//returns the ID of the new Planner
//example-e00ecbac-xxxx-xxxx-xxxx-xxxxxxxxxxx
Plan shows then in the Planner App for the assigned user. No Group-Channel shown below the Plan.
Additional users can be invited and the Plan can be managed from the standard Planner App UI.