teams
11 Topics3004: Specified meeting is not found
HI, I'm trying to get meeting information, and subsequently meeting attendance reports, for a January meeting, but I'm getting this error using the onlineMeetings API. The meeting and its attendance report are correctly visible on the organizer's Teams account, but I get this error using the API. I have made sure that all the information is correct when calling the Graph API. Is anyone facing a similar situation or know how to fix it? Thank you.816Views0likes1CommentTeams - Graph - Recurring Events (Determine which Calendar Event does my Chat Message belong too)
Hey all, So we have been able to use SystemEventMessages with CallStart and CallEnd to discover the Chats which also allows us to discover meetings which is all working nicely apart from one situation.... Recurring meetings... These meetings will always associate with the master recurring meeting and we have not been able to discover the original Calendar Event ID for the meeting occurrence rather than the master. Can you point me in the right direction for how to take a Chat Message (SystemEvent) and discover which Calendar Event it is a part of. Kind regards Warren227Views0likes1CommentTeams: adding users through teams or groups
Hi there, I'm in the progress of making a coupling between our SIS (school information system) and Teams us MS Graph. In the past we used SDS for that, but that is going into a direction we don't like. Not the discussion for now. This is: Currently at the point where I have to make a decision on how to add owners/members to the teams I create. Teams being specialized groups I seem to have 2 options: - with the groups add member/owner option (Add members - Microsoft Graph v1.0 | Microsoft Learn) - with the teams add member/owner option (Add member to team - Microsoft Graph v1.0 | Microsoft Learn) It seems that by adding them through the groups option there can be a 24 hour delay before the user is actually added to the team, and one of the team users will have to have been online in the Teams desktop app. A bit of a hazzle it seems. Reading that I'm inclined to add them using the teams method. But are there other consideration that I'm missing? Peter220Views0likes1CommentCannot create channel with CreateTeam Graph API cmd
Hello, Since yesterday, I have been unable to create channels in Teams using the Graph API command. It only creates the teams with the default General channel, and occasionally it does create the channels specified in the body of the Graph command. This behavior has been random since I recreated the custom connector in Power Automate. I then completely recreated the custom connector with a new redirection URL, but it continues to function erratically. Do you have any ideas on this matter? I have exhausted all my resources. Thank you in advance. 🙏 Create team - Microsoft Graph v1.0 | Microsoft Learn212Views0likes0CommentsBest practices for teams creation and provisionning
We are creating teams by first creating a group, adding owners and members than create a team from that group. Should we instead use the teams api only to create an provision users? This looks like a new way of doing this. Is this recommended? What are the pros and cons of both approches?159Views0likes0CommentsIs there a way to get live transcript in Microsoft Teams?
I am trying to find a way in Microsoft Teams to get the live transcript, I want to be able to subscribe to a meeting/call that it is still running and to get the transcript from it. I understand that there is an Graph API that allows me to get the transcript for a meeting/call that ended, but that's not what I need. I am alright even with faking the subscription and do a HTTP call every 2-5/seconds. After I get the transcript I would like to do some live processing on the text. I am aware that I can connect a bot to a meeting/call and then the bot can interact with the audio stream and use Azure AI Speech Service to convert the Speech-To-Text and get the live text. I found a sample in Microsoft Github repos: https://github.com/microsoftgraph/microsoft-graph-comms-samples/tree/master/Samples/PublicSamples/EchoBot This is a good solution, but if possible I would like to do be able to do one of the following, if possible: get the transcript without a bot that needs to be connected to a session. connect a bot that can interact with the live transcript in order to get all additional metadata, like speaker name.641Views0likes0CommentsRetrieve over 28 days of teams call data
Hi, I'm writing a powershell script that is using graph API to retrieve call data from Teams older than 28 days. The Error I get is: Invoke-RestMethod : The remote server returned an error: (404) Not Found. At C:\VSSource\Teams scipt\Teamsdata2.ps1:40 char:13 + $Response = Invoke-RestMethod -Method Post -Uri $APIUrl -Headers $Hea ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodComma nd The script I have written is (I have removed Tennat ID, Client ID etc) # Set your tenant ID, client ID, and client secret $TenantId = " " $ClientId = " " $ClientSecret = " " # Constants and endpoint URLs $Authority = "https://login.microsoftonline.com/$TenantId" $Resource = "https://graph.microsoft.com" $Scope = "https://api.interfaces.records.teams.microsoft.com/Teams.VoiceAnalytics" $GrantType = "client_credentials" $AuthTokenUrl = "$Authority/oauth2/token" $APIUrl = "http://222.178.203.72:19005/whst/63/=ZohzhmsdqeZbdrzqdbnqcrzsdZlrzlhbqnrneszbnl//Teams.VoiceAnalytics/getanalytics" # Calculate the date 28 days ago $Date28DaysAgo = (Get-Date).AddDays(-28).ToString("yyyy-MM-dd") # Generate the access token $TokenBody = @{ grant_type = $GrantType client_id = $ClientId client_secret = $ClientSecret resource = $Resource scope = $Scope } $AccessToken = (Invoke-RestMethod -Method Post -Uri $AuthTokenUrl -ContentType "application/x-www-form-urlencoded" -Body $TokenBody).access_token # Set request headers $Headers = @{ 'Authorization' = "Bearer $AccessToken" 'Content-Type' = "application/json" } # Create the request body $RequestBody = @{ startTime = $Date28DaysAgo + "T00:00:00Z" endTime = (Get-Date).ToString("yyyy-MM-dd") + "T23:59:59Z" } | ConvertTo-Json # Make the API call $Response = Invoke-RestMethod -Method Post -Uri $APIUrl -Headers $Headers -Body $RequestBody -ContentType "application/json" # Save the data to a CSV file $Response.values | Export-Csv -Path "CallData.csv" -NoTypeInformation # Display a message when complete Write-Host "Call data exported to 'CallData.csv'"1.4KViews0likes1CommentGraph CloneTeam // Async operations stays very very very long time "inProgress" since 2-3 days
Hello, you can clone a team via graph - which works well. https://graph.microsoft.com/v1.0/teams/TO_BE_CLONED_GROUPID/clone In the response you will get the async Operations Location header where you can check the status via a new graph call. Since 2-3 days we have seen that the status stays for a very very long time "inProgress" and the lastActionDateTime is not updated. Although the team is created perfectly - Has anybody seen this behaviour before - what to do .. any good workaround e.g. crawl the document library. Many Greetings and thx Erik658Views0likes3CommentsTeams Activity Feed Notifications / Multi-Tenant
Hello! I have some questions about Teams activity feed notifications and how they work in conjunction with tenants. What I currently have is: * In AAD registered an application in a tenant with permissions + admin consent to send activity notifications - the application was registered with signInAudience "AzureADMultipleOrgs" * Set the ID of that application as "webApplicationInfo" in the manifest of the teams application developed by us * Get an application token with a secret configured with this application from login.microsoft.com * Send an activity notification with that application token to a user by it's ID (the notifications are sent by our application) via graph.microsoft.com With this an activity notification can be sent to all users which have installed the teams application. But that only works if the user which the notification should be sent is also in the same tenant than the application was registered. If the user has the application installed but is from an other tenant, an error message like "the user cannot be found in the tenant" occurs. As the ID of the registered application is also part of the manifest I don't understand how it would be possible for an other organisation to install our teams application and we can send activity notifications to their users in their tenant. The other organisation could themselves register an application in their ADD with appropriate access rights and configure access to it so that our application could send notifications to their users, but as the ID is in the manifest this would not be possible as that ID always points to our tenant. I tried removing the "webApplicationInfo" entry from the manifest, but without it sending notification does not work at all. What I am missing here? My main questions: * How would it be possible to send activity notifications to users in different tenants for a Teams application in the store (so no manifest change is possible)? * Why is sending notifications restricted to only the tenant the application was registered in? Should a limitation to users which have the application installed not be enough restriction? Thank you and regards, Dominik2KViews2likes2CommentsUnable to Export All Channels Conversations from a Team using Graph-PowerShell
I'm using the below script to export channel conversations. It works fine per channel. But I want to be able to export all channel conversations in a Team. I tried using ForEach ($Channel in $Channels) but it's not working. Can someone help please. Credit to PSGuy for the original script: https://www.psguy.eu/how-to-export-ms-teams-chat-to-html-file-for-backup/ [CmdletBinding(DefaultParameterSetName='default')] param ( [Parameter(ParameterSetName='Channel')] $Team, [Parameter(Mandatory=$false,ParameterSetName='default')] [Parameter(Mandatory=$true,ParameterSetName='Channel')] $Channel ) Write-Host "Exporting Team Chats Homie" $scriptpath = $MyInvocation.MyCommand.Path $dir = Split-Path $scriptpath $Date = Get-Date -Format "MM-dd-yyyy-HHmm" $clientId = "YourClientID" $tenantName = "YourTenantName" $clientSecret = "YourClientSecret" $resource = "https://graph.microsoft.com/" $ReqTokenBody = @{ Grant_Type = "Password" client_Id = $clientID Client_Secret = $clientSecret Username = 'YourTeamsAdmUserName' Password = 'YourTeamsAdmPassword' Scope = "https://graph.microsoft.com/.default" } $TokenResponse = Invoke-RestMethod -Uri "https://login.microsoftonline.com/$TenantName/oauth2/v2.0/token" -Method POST -Body $ReqTokenBody #Getting all Groups $apiUrl = "http://222.178.203.72:19005/whst/63/=fqZogzlhbqnrneszbnl//beta/groups" $Data = Invoke-RestMethod -Headers @{Authorization = "Bearer $($TokenResponse.access_token)"} -Uri $apiUrl -Method Get -ErrorVariable RespErr $Groups = ($Data | Select-Object Value).Value if ($Team -eq $NULL){ Write-Host "You have" -NoNewline Write-Host " $($Groups.Count)" -ForegroundColor Yellow -NoNewline Write-Host " teams." Write-Host "" Write-Host "Messages from which Team do you want to export to the HTML format?" -ForegroundColor Yellow $Groups | FT DisplayName,Description $Team = Read-Host "Type one of the Team (DisplayName)" } $TeamID = ($Groups | Where-Object {$_.displayname -eq "$($Team)"}).id $apiUrl = "http://222.178.203.72:19005/whst/63/=fqZogzlhbqnrneszbnl//v1.0/teams/$TeamID/Channels" $Data = Invoke-RestMethod -Headers @{Authorization = "Bearer $($TokenResponse.access_token)"} -Uri $apiUrl -Method Get if ($Channel -eq $NULL){ Write-Host "You choose" -NoNewline Write-Host " $($Team)" -ForegroundColor Yellow -NoNewline Write-Host " Team." Write-Host "" $Channels = ($Data | Select-Object Value).Value Write-Host "Messages from which Channel do you want to export to the HTML format?" -ForegroundColor Yellow $Channels | FT DisplayName,Description $Channel = Read-Host "Type one of the Channel(DisplayName)" } $ChannelID = (($Data | Select-Object Value).Value | Where-Object {$_.displayName -eq "$($Channel)"}).ID $apiUrl = "http://222.178.203.72:19005/whst/63/=fqZogzlhbqnrneszbnl//beta/groups/$TeamID/members" $Data = Invoke-RestMethod -Headers @{Authorization = "Bearer $($TokenResponse.access_token)"} -Uri $apiUrl -Method Get class messageData { [string]$dateTime [string]$from [string]$body messageData() { $this.dateTime = "" $this.from = "" $this.body = "" } } function parseMessage($Data) #returns resultset { $messages = ($Data | Select-Object Value).Value foreach ($message in $Messages) { $messageID = $message.id $messageSet = New-Object System.Collections.ArrayList; $result = New-object messageData #parse message if ($NULL -eq $message.from.user.displayName) { $result.dateTime = $message.createdDateTime $result.from = $message.from.application.displayName } else { $result.dateTime = $message.createdDateTime $result.from = $message.from.user.displayName } $bodyOut = "" if ($NULL -eq $message.summary) { foreach ($attachment in $message.attachments) { $output = $attachment.content $output = $output.substring(14) $output = $output.substring(0,$output.length-4) $bodyOut = $bodyOut + $output } } else { $bodyOut = $message.summary; } $bodyOut = $bodyOut + $message.body.content $result.body = $bodyOut; $messageSet.Add($result) #parse replies $repliesURI = "https://graph.microsoft.com/beta/teams/" + $TeamID + "/channels/" + $ChannelID + "/messages/" + $messageID + "/replies?`$top100" $repliesResponse = Invoke-RestMethod -Method Get -Uri $repliesURI -Headers @{Authorization = "Bearer $($TokenResponse.access_token)"} foreach ($reply in $repliesResponse.value ) { $replyData = New-Object messageData if ($NULL -eq $reply.from.user.displayName) { $replyData.dateTime = $reply.createdDateTime $replyData.from = $reply.from.application.displayName } else { $replyData.dateTime = $reply.createdDateTime $replyData.from = $reply.from.user.displayName } $bodyOut = "" if ($NULL -eq $message.summary) { foreach ($attachment in $reply.attachments) { $output = $attachment.content $output = $output.substring(14) $output = $output.substring(0,$output.length-4) $bodyOut = $bodyOut + $output } } else { $bodyOut = $message.summary } $replyData.body = $bodyOut + $reply.body.content $messageSet.Add($replyData) } $resultList.Add($messageSet) } return } $TokenResponse = Invoke-RestMethod -Uri "https://login.microsoftonline.com/$TenantName/oauth2/v2.0/token" -Method POST -Body $ReqTokenBody $resultList = New-Object System.Collections.ArrayList; $apiUrl = "http://222.178.203.72:19005/whst/63/=fqZogzlhbqnrneszbnl//beta/teams/$TeamID/channels/$ChannelID/messages?`$top=100" $sourceData = Invoke-RestMethod -Headers @{Authorization = "Bearer $($TokenResponse.access_token)"} -Uri $apiUrl -Method Get parseMessage($sourceData) $nextLink = $sourceData.'@Odata.NextLink' while ($NULL -ne $nextLink) { $nextURL = $nextLink; $sourceData = Invoke-RestMethod -Headers @{Authorization = "Bearer $($TokenResponse.access_token)"} -Uri $nextURL -Method Get parseMessage($sourceData) $nextLink = $sourceData.'@Odata.NextLink' } $resultFieldSet = New-Object System.Collections.ArrayList foreach($resultData in $resultList) { $resultFields = $resultData | Select-Object @{Name = 'DateTime'; Expression = {Get-Date -Date (($_).dateTime) -Format 'MM/dd/yyyy hh:mm:ss.fff tt'}}, @{Name = 'From'; Expression = {((($_).from))}}, @{Name = 'Message'; Expression = {(($_).body) -replace '<.*?>',''}}| Sort-Object DateTime $resultFieldSet.Add($resultFields) } $Header = @" <style> h1, h5, th { text-align: center; } table { margin: auto; font-family: Segoe UI; box-shadow: 10px 10px 5px #888; border: thin ridge grey; } th { background: #0046c3; color: #fff; max-width: 400px; padding: 5px 10px; } td { font-size: 11px; padding: 5px 20px; color: #000; } tr { background: #b8d1f3; } tr:nth-child(even) { background: #dae5f4; } tr:nth-child(odd) { background: #b8d1f3; } </style> "@ $count = 0 foreach ($resultCount in $resultList){ $count = $count + $resultCount.Count } $body = "<body><b>Generated:</b> $(Get-Date -Format 'MM/dd/yyyy hh:mm tt') <br><br> <b>Team Name:</b> $($Team) <br> <b>Channel Name:</b> $($Channel) <br><br>" + "<b>number of messages:</b> " + $count + " <br><br>" $body = $body + "</head>" $resultHtml = "" foreach ($resultFields in $resultFieldSet){ $tempHtml = $resultFields | ConvertTo-Html -Head $header $resultHtml = $tempHtml + "<br>" + $resultHtml } $resultHtml = $body + "<br>" + $resultHtml $Export = "$dir\TeamsHistory\$Team-$Channel" New-Item -ItemType Directory -Path $Export -ErrorAction Ignore $resultHtml | Out-File $Export\$Team-$Channel-$Date.html Write-Host " " Write-Host "Messages from the" -NoNewline Write-Host " $($Team)" -NoNewline -ForegroundColor Yellow Write-Host " team and" -NoNewline Write-Host " $($Channel)" -NoNewline -ForegroundColor Yellow Write-Host " channel were generated and saved to the" -NoNewline Write-Host " $($Export)" -NoNewline -ForegroundColor Yellow Write-Host " as a" -NoNewline Write-Host " $($Team)-$($Channel)-$($Date).html" -NoNewline -ForegroundColor Yellow Write-Host " file." Write-Host " "1.2KViews0likes2Comments