Microsoft Teams is Microsoft’s team collaboration solution. The Office 365 for IT Pros eBook includes over 300 pages dedicated to Teams, and we cover the topic extensively on the site.
Every time someone reacts to a message in a team chat or channel conversation, Teams captures an audit record and sends it to the Office 365 audit log. The Teams reactions audit records are an interesting source of information. In this article, we show how to use PowerShell to interpret the contents of the reactions, and how to use the data to find the underlying messages.
No Teams administration policy controls the creation of regular channels. Policies are there to control the creation of shared and private channels, but not the regular variety. Team owners can restrict creation on a team-by-team basis, but if organizations want to apply central control, they’ll need to do it with PowerShell.
Some recent announcements have shown Yammer’s new direction. The Communities app is now Viva Engage and Teams Meeting Q&A app is powered by Yammer. That’s all good because it negates some of the tension between Teams and Yammer in terms of positioning within Microsoft 365. The messages that make up Q&A in Teams meetings are captured for compliance purposes, and that’s also a good thing.
No Microsoft 365 admin portal will tell you about the set of email addresses assigned to Teams channels. Fortunately, it’s relatively easy to create a report with PowerShell and just a little Graph magic.
A new feature allows Teams users to start new group chats by adding participants from the membership of distribution lists, Microsoft 365 groups, or mail-enabled security groups. It’s a neat way to add up to 249 participants to a new group chat. And while we’re covering the topic of adding people to group chats, we also mention the oft-overlooked feature that allows Teams tags to be used for this purpose.
In this article, we explain how to create a report about the Teams private channels found in a tenant together with the members and owners of each channel. The PowerShell script is relatively straightforward and once the data is extracted from Teams, it can be sliced and diced in different ways.
The Get-AssociatedTeam cmdlet is part of V4.6 of the Microsoft Teams PowerShell module. It reports the membership a user account has in teams, including where the account has direct membership of shared channels. The cmdlet makes it easy to generate a report of teams membership, and the PSWriteHTML module makes it easy to output nice PDF reports.
This article explains how to populate the membership of a Teams shared channel using PowerShell. The idea is to create a shared channel that’s used for organization-wide communications, like a HR questions and answers channel. Alternatives like using a dynamic Azure AD group with a filter to find Teams users are also considered.
Version 4.6 of the Microsoft Teams PowerShell module includes the Get-TeamAllChannel cmdlet. As the name implies, the cmdlet returns details of all channels in a team (regular, private, and shared). To see what it does, we wrote a script to report all the channels in teams in a tenant.
The Teams Files policy gives a way for administrators to control if users see the Teams Files tab in every channel and Teams chat, and if they can access OneDrive and SharePoint to upload files. The policy exists for organizations that have standardized on other file storage systems such as Box or Dropbox.
In a July 12 announcement, Microsoft says that they will restrict the use of Exchange Web Services to access Teams message data from September 30. Microsoft wants customers to use the Teams Export API instead. All that’s fine, but it means that customers have to change their Teams backup product to one that uses the new API – and they’ll be charged for the privilege of using the Export API.
Microsoft has improved the functionality of the Teams Files channel tab since its introduction. The most recent update adds SharePoint’s Grid View and Details pane, and the net effect is that the Files channel tab is now almost as functional as the SharePoint browser interface.
Microsoft has announced that Teams will no longer provision the Teams Wiki channel tab for newly created channels. The change goes into effect in mid-August. It seems like not many people like the Teams Wiki, but it does its job and deserves a little respect – or does it?
Stale Teams meetings have just one participant and last more than 10 minutes past the scheduled end time. Soon, Teams will end these meetings automatically. It’s a small but useful change that will prevent Teams meetings lingering on in cyberspace long after anything useful ceased happening in the gathering.
Two recent and useful enhancements for Viva Topics are rolling out to Microsoft 365 tenants. You can now include topic cards in Teams chat messages and knowledge managers can add external references (website links) to topic cards. Neither might seem terribly important, but both changes make Viva Topics more useful and usable.
Teams likes to control the channel folders it creates in SharePoint Online, which is why it removes the Delete and Move to options from the folder menu. But once Teams removes a channel permanently, shouldn’t it allow the SharePoint folder to be removed?
A new feature allows administrators to block the ability of anonymous participants to send chats during Teams meetings. They can still read chats, but can’t send messages. Microsoft calls this write access to chat, which I guess it is. In other news, the new browser interface for Teams meetings is arriving in tenants and it’s much better than the old one.
A new setting in Teams meeting policies allows administrators to control the languages used to generate Teams meeting invitations. The policy setting takes precedence over the language used by the user who creates a new Teams meeting. You can select up to two languages.
Message center notification MC392289 highlights the need to keep the .NET Framework and the Edge WebView2 components updated to make sure that the Teams meeting add-in works with “degradation.” No further information is offered as to why Microsoft needs to sound this warning several years after introducing the Teams meeting add-in.
It’s easy to create a Teams meeting from Outlook, but it’s also easy to create a Teams meeting in the wrong calendar. This can lead to the “message of doom” when you try to connect to the meeting and end up in the Teams meeting lobby with nowhere to go. Apart from being careful about which calendar a meeting is created in, it’s a good idea to add an organization logo to Teams meeting invites so that if you create the meeting when signed into the wrong organization, you’ll get a visual clue.
Microsoft Teams users can use the chat with self feature to create a special chat designed to take notes and capture other information someone might want. It’s similar to features that exist in other messaging platforms, so it’s likely that the Teams chat with self capability will be well-accepted by users, especially those with secrets to share with themselves.
Despite the advent of shared channels in Teams and the wonders of Azure AD Direct Connect, the chances are that Azure AD B2B Collaboration (Azure AD guest accounts) will remain the predominant method for external collaboration for the immediate future. That’s not so bad, as long as you maintain good guest hygiene!
Microsoft will soon make an update available for Purview Premium eDiscovery to reveal Teams reactions to chats and channel conversations when investigators review the results of searches. The information comes from Teams rather than the compliance records stored in Exchange Online. The new feature isn’t coming to Standard eDiscovery.
The Microsoft 365 substrate captures Teams compliance records for chats and channel conversations and stores them in Exchange Online. How many do you have? Although you might not care, sometimes it’s good to know (like a tenant to tenant migration), so we explain how to count Teams compliance records for chats and channel conversations.
The Teams platform is an attractive target for developers, especially now that Microsoft supports monetization opportunities for Teams apps. In other words, ISVs can make money by selling licenses for their apps or through in-app purchases. That’s a good thing from an ISV perspective, but it’s yet another factor for administrators to factor in when deciding to unblock apps for users.
A new feature allows Teams users to request access to Teams Store apps that are currently blocked. Administrators review requests and decide to release or continue blocking the app. Microsoft says that seamless communication happens between users and administrators. That’s not what I experienced…
Two new features are available to Teams users. The Teams Owners automatic grouping (tag) allows users to address channel messages to the owners of a team (but not in private or shared channels),. Teams desktop clients catch up with their mobile counterparts by supporting suggested replies in 1:1 chats. Neither are particularly earthshattering features, but both are useful in their own way.
Microsoft Loop components are available now in Teams chats and will soon become available in OWA. Loop components are a new way of collaborative working that some will find very attractive. However, under the covers, some compliance issues can block organizations from allowing the use of Loop components. This post explains the issues involved in eDiscovery and export of items containing Loop components.
Outlook users have been able to see LinkedIn profile information for several years. Now Teams chat has the same kind of LinkedIn connection to expose profile information of people you chat with. Because Teams is more internally-focused than email is, the integration might be less useful than it is in Outlook. Then again, you might need to find out some information about people you work with!
On the surface, the Admin-Microsoft 365 Teams app seems to offer a lot of promise. However, its functionality is disappointing and anyway, do you really want administrators performing tenant management through Teams when they’re signed into their personal accounts? Some will like the app, but I’m not a fan.
A new capability for Teams meetings allows streaming of content using RTMP to platforms like YouTube. To Microsoft’s credit, they’ve built a feature that even video novices can use. The possibilities to live stream in scenarios like webinars and product announcements are endless.
It’s a good idea for administrators to know when people archive or restore teams, just in case users lose access to private or shared channels. This article explains how to search the audit log to find records for these actions, extract the relevant data, find information about channels belonging to the teams, and create a report.
When a team owner or administrator archives a team, any shared or private channels in the team along with their SharePoint Online sites are archived and become read-only. This is fine if the team owner realizes the effect on these channels and their users, but problems might happen when team owners aren’t members of the channels and therefore don’t know of their existence. Unless of course they take the time to check using the Teams Admin Center or PowerShell, which is exactly what happens when archival occurs – or is it?
Sharing information generated by a PowerShell script running in Azure Automation can be a challenge. Some time ago, I wrote about creating an output file in a SharePoint Online document library. Here I explore how to do the job by posting to a Teams channel using two different methods.
Two new filters available for Teams video meetings promise to help participants look their very best. The brightness filter projects a soft light onto the face of participants while the soft-focus (aka Botox) filter reduces the effect of facial wrinkles and cease lines. Although no miracles are promised, the new filters should help everyone look a little better the next time they turn on video during a Teams call.
A new Microsoft Graph query makes it easy to fetch per-team activity data for reporting. You can also fetch the data with the Microsoft Graph PowerShell SDK. The data goes back a maximum of 90 days and is at least two days old when you fetch it. Those facts are easy to live with. What’s not so good is that the activity data focuses exclusively on channel activity and avoids everything else which happens in Teams.
Sometimes useful features show up in a Microsoft 365 app long after they should have been there. This is the case of SharePoint Online’s document library dropdown menu, which is very helpful in navigating sites with multiple libraries. Unfortunately, not too many sites have multiple libraries because most are Teams-enabled and have a single library. Teams is another app where features show up after they should. The listing of the teams a user belongs to in the Teams admin center is a good example.
It seems like it should be possible to transfer a membership rule from an Exchange dynamic distribution list to a dynamic Microsoft 365 group/team, but it’s not. Different directories, schemas, properties. and syntax conspire to stop easy conversion. It’s a pity, but that’s the way life and technology sometimes go…
Teams tags appeared in early 2020 as a method to address subsets of a team membership in channel conversations. Microsoft doesn’t provide a method to report what teams use tags and what those tags are, but we can find out using the Graph APIs. In this article, we show how to use the Microsoft Graph PowerShell SDK to create a report of all teams which use tags, the names of the tags, and the team members assigned the tags.
This article explains how to create a new Microsoft 365 group and team using the membership and properties of an Exchange Online dynamic distribution list. The process is reasonably straightforward, but as always with PowerShell, there are some interesting turns and twists that must be navigated en route.
{"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}