山口屋~活動日誌~

私生活で主な出来事をピックアップ

Viva Engage コミュニティ作成 PowerShell Yammer

2024-03-11 23:23:10 | パソコン
Viva Engage(旧 Yammer)のコミュニティ作成をPowerShellで行うために調査中。

Microsoft Learn:Create community
Microsoft Tech Community:Introducing the Community Creation API for Viva Engage on Microsoft Graph Beta
Office 365 for IT Pros:Creating Viva Engage Communities with the Graph API
Linkedin:How to get your Viva Engage (Yammer) related M365 Groups?

<Viva Engage(旧 Yammer)のグループを作成>
一応作成されるのだが、Entra ID のグループリンク欄に Yammer がなかったり、自分以外を所有者に指定するとメンバーに入らないなど、普通に作成するのと同じにはならない。
$VivaCommunityParameters = @{"displayName" = "Viva Engage Technical Discussions";"description" = "A community where everyone gets together to discuss the technology that drives Viva Engage and its communities.";"privacy" = "Private";"owners@odata.bind"=@("https://graph.microsoft.com/beta/users('" + $userid + "')")}
$VivaCommunityBody = $VivaCommunityParameters | ConvertTo-Json
$Uri = "https://graph.microsoft.com/beta/employeeExperience/communities"
Invoke-MgGraphRequest -Uri $Uri -Method POST -Body $VivaCommunityBody -StatusCodeVariable "Status"

<Viva Engage(旧 Yammer)のグループを確認してコミュニティサイトURLを取得>
Get-UnifiedGroup | Where-Object {$_.GroupSku -eq "Yammer"} | Foreach-Object {if($_.ServiceEndpointUris.Count -gt 0) {$_.ServiceEndpointUris = $_.ServiceEndpointUris.replace("Yammer.FeedURL:", ""); $_ | Select-Object ExternalDirectoryObjectId,ServiceEndpointUris}}
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Base64 デコード エンコード コマンド スクリプト PowerShell

2024-03-10 17:36:36 | パソコン
Base64形式の文字列のデコード/エンコード
Qiita:WindowsでBase64エンコード/デコードする方法
Hangout Laboratory:【PowerShell】Windowsの標準機能でBase64エンコード/デコードする方法

<バッチファイル:デコード>
@echo off
cd /d %~dp0
certutil -f -decode base64in.txt decode.txt
pause

<バッチファイル:エンコード ※先頭に「-----BEGIN CERTIFICATE-----」末尾に「-----END CERTIFICATE-----」が入る>
@echo off
cd /d %~dp0
certutil -f -encode encode.txt base64out.txt
pause

<PowerShell:デコード>
[System.Text.Encoding]::Default.GetString([System.Convert]::FromBase64String($text))

<PowerShell:エンコード>
[Convert]::ToBase64String(([System.Text.Encoding]::Default).GetBytes($string))
末尾のパディングを削除するならば
[Convert]::ToBase64String(([System.Text.Encoding]::Default).GetBytes($string)).TrimEnd('=')

Base64形式については他でも調べていたことがあったらしい→メール 改行 76文字 SMTP MIME
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

タブ Teams PowerShell teamsAppId Viva Engage

2024-03-10 17:35:55 | パソコン
Teams タブを PowerShell で制御しようというもの。いいサンプルがなくてなかなか大変だった。

グループ一覧を取得してチームIDを確認。
Get-UnifiedGroup | Select-Object DisplayName,ExternalDirectoryObjectId

チャンネル一覧やタブ一覧の確認。
<チャンネル一覧の確認>
Get-MgBetaTeamChannel -TeamId $ExternalDirectoryObjectId
<タブ一覧の確認>
Get-MgBetaTeamChannelTab -TeamId $ExternalDirectoryObjectId -ChannelId $Id
<余談>
Get-MgBetaTeamPrimaryChannel や Get-MgBetaTeamPrimaryChannelTab というのもあるが未確認。

ここから先のタブ操作がサンプルが少なくて難産だった。

Webサイトのタブ追加処理
github.com:Help with adding a tab Issue - #1287
EUC365:Create A Microsoft Team With Graph API And PowerShell
configuration 内の ContentUrl と WebsiteUrl は両方指定しておかないとタブが上手く開かなかった。
$params = @{displayName = "My Web Tab"; "teamsApp@odata.bind" = "https://graph.microsoft.com/v1.0/appCatalogs/teamsApps/com.microsoft.teamspace.tab.web"; configuration = @{ContentUrl = "https://bing.com";WebsiteUrl = "https://bing.com"}}
New-MgBetaTeamChannelTab -TeamId $ExternalDirectoryObjectId -ChannelId $Id -BodyParameter $params

アプリのタブ追加処理
Microsoft Learn:Configure the built-in tab types in Microsoft Teams
上記のページに記載のないアプリ(Viva Engage とか)はどうすればいいか。Teams向けアプリのID(teamsAppId)を調べるしかない。
Microsoft Learn:Deep linking into Viva Engage
Teams向けアプリを開くリンクは下記の構文なのでここから読取。
https://teams.microsoft.com/l/entity/{teamsAppId}/
そうして出来上がった、Viva Engage タブ追加処理。EntityIdを指定しなくてもタブは開いたが、WebUrlの値がユーザー操作の追加よりも短くなっていたので、EntityIdは指定したほうが無難。
$params = @{displayName = "My Viva Engage"; "teamsApp@odata.bind" = "https://graph.microsoft.com/v1.0/appCatalogs/teamsApps/db5e5970-212f-477f-a3fc-2227dc7782bf"; configuration = @{WebsiteUrl="https://www.yammer.com";ContentUrl = "https://web.yammer.com/teams/groups/{※}?client=teams";EntityId="https://web.yammer.com/teams/groups/{※}?client=teams"}}
New-MgBetaTeamChannelTab -TeamId $ExternalDirectoryObjectId -ChannelId $Id -BodyParameter $params
※encode {"_type":"Group","id":"$feedId"} into Base64 format without padding
※Office 365 for IT Pros:Creating Viva Engage Communities with the Graph API

Viva Engage(旧 Yammer)のコミュニティサイトURLからfeefidを取得してTeamsタブ向けURLに変換
$ServiceEndpointUri = "Yammer.FeedURL:https://www.yammer.com/{domain}/#/threads/inGroup?type=in_group&feedId={feedId}"
# 正規表現のクエスチョンはエスケープ
$RegularExpression = '^Yammer.FeedURL:https://www.yammer.com/{domain}/#/threads/inGroup\?type=in_group&feedId=(.*)$'
"https://web.yammer.com/teams/groups/" + [Convert]::ToBase64String(([System.Text.Encoding]::Default).GetBytes("{""_type"":""Group"",""id"":""" + ($ServiceEndpointUri -replace $RegularExpression,'$1') + """}")).TrimEnd('=') + "?client=teams"

Notes タブの削除
$notesTab = (Get-MgBetaTeamChannelTab -TeamId $ExternalDirectoryObjectId -ChannelId $Id | Where-Object {$_.DisplayName -eq "Notes"})
Remove-MgBetaTeamChannelTab -TeamId $ExternalDirectoryObjectId -ChannelId $Id -TeamsTabId $notesTab.id

主要アプリの teamsAppId
github.com:Start-DSCConfiguration not inputting TeamsAppPermissionPolicy - no error seen - #3373
"0d820ecd-def2-4297-adad-78056cde7c78":OneNote
"1c4340de-2a85-40e5-8eb0-4f295368978b":Power BI
"26bc2873-6023-480c-a11b-76b66605ce8c":Lists
"2a527703-1f6f-4559-a332-d8a7d288cd88":SharePoint
"2e29398f-1131-4d94-b79f-9c7aa1cfb672":Azure DevOps Server
"4c4ec2e8-4a2c-4bce-8d8f-00fc664a4e5b":Bookings
"57e078b5-6c0e-44a1-a83f-45f75b030d4a":Viva Insights
"7299542a-1697-4ec1-812b-6b70065c0795":Azure Boards
"81fef3a6-72aa-4648-a763-de824aeafb7d":Microsoft Forms
"a6b63365-31a4-4f43-92ec-710b71557af9":Power Apps
"b4f7d39f-ddc7-4f7e-b320-4344444c5e0e":Places
"c3a1996d-db0f-4857-a6ea-7aabf0266b00":Workflows
"cd2d8695-bdc9-4d8e-9620-cc963ed81f41":Dynamics 365
"d5c805b6-2882-45d3-8657-c4f27520f184":Images
"d832a33f-28c2-4969-8ad0-4fee681dc5b4":Praise(称賛)
"db5e5970-212f-477f-a3fc-2227dc7782bf":Viva Engage
"f101079c-3162-4ebe-a651-eba617b4be69":Azure Pipelines
"fc057f53-bb6b-4868-9eb8-a93a8a361b71":Azure Repos
"73d49226-b5c0-42f0-b918-acd20e8a22d8":Custom Filters
"com.microsoft.teamspace.tab.planner":Planner
"com.microsoft.teamspace.tab.vsts":Azure DevOps
"com.microsoft.teamspace.tab.web":Web サイト
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

グループ M365 作成 Teams チーム PowerShell

2024-03-10 16:49:47 | パソコン
Microsoft365グループを作成してからTeamsのチームも作成するという操作をPowerShellで行うというお話。

<新規にMicrosoft365グループを作成>
New-UnifiedGroup -DisplayName $displayName

<既定値を確認>
Get-UnifiedGroup | Select-Object DisplayName,ExternalDirectoryObjectId,AlwaysSubscribeMembersToCalendarEvents
Get-UnifiedGroup | Select-Object DisplayName,ExternalDirectoryObjectId,WelcomeMessageEnabled
Get-UnifiedGroup | Select-Object DisplayName,ExternalDirectoryObjectId,AccessType
Get-UnifiedGroup | Select-Object DisplayName,ExternalDirectoryObjectId,RequireSenderAuthenticationEnabled

AlwaysSubscribeMembersToCalendarEvents は Ture から False に変更したい。
WelcomeMessageEnabled は True から False に変更したい。
AccessType は private だったので変更しなくてよさそうだ。
RequireSenderAuthenticationEnabled は True だったので変更しなくてよさそうだ。

<メールアドレスを確認、変更、削除>
Get-UnifiedGroup | Select-Object DisplayName,ExternalDirectoryObjectId,PrimarySmtpAddress
Set-UnifiedGroup -Identity $ExternalDirectoryObjectId -PrimarySmtpAddress $newEmailAddress
Set-UnifiedGroup -Identity $ExternalDirectoryObjectId -EmailAddresses @{remove=$oldEmailAddress}

メールアドレスは DisplayName に応じた文字列になるため、新メールアドレスに変更。旧メールアドレスはエイリアスに移るので削除。
メールアドレスにしたい文字列をDisplayNameとしたグループを作成しておいてDisplayNameを変更するという方法も考えられるが、偶然同じDisplayNameのグループがあったときには自動処理で困る。
Microsoft Learn:Troubleshoot: Remove an alias from a group

<Microsoft365グループからTeamsのチームを作成>
New-Team -GroupId $ExternalDirectoryObjectId
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

チャット Teams PowerShell

2024-03-10 13:16:34 | パソコン
Teams チャットを PowerShell で制御しようというもの。自分のチャットが対象で、グローバル管理者でも他者のチャットは対象にできなかった。

チャットIDの取得からスタート。
Microsoft Learn:Get-MgUserChat
Qiita:PowerShellでTeamsのチャット履歴をcsvに出力する
チャットIDは OneOnOne か Group かで末尾にある程度の規則性があり取得は下記の例で。
Get-MgBetaUserChat -All -UserId $selfUserId
WebUrl プロパティにURLが含まれていて、例えば Edge で開かせるならば下記の例で。
start microsoft-edge:$($_.WebUrl)

特定のチャットに参加しているユーザーの取得。AdditionalProperties に詳細なプロパティが含まれるので展開。
Get-MgBetaUserChatMember -UserId $selfUserId -ChatId $id | Select-Object `
@{Label="@odata.type"; Expression={$_.AdditionalProperties["@odata.type"]}}, `
@{Label="UserId"; Expression={$_.AdditionalProperties["userId"]}}, `
@{Label="Email"; Expression={$_.AdditionalProperties["email"]}}, `
@{Label="TenantId"; Expression={$_.AdditionalProperties["tenantId"]}}, `
* -ExcludeProperty AdditionalProperties

全てのチャットに一律で投稿をする。多重投稿が起きることがあり、チャットID一覧を一度保存してから実行するようにしている。
$chatlist = Get-MgBetaUserChat -All -UserId $selfUserId
# 一度保存してから Foreach-Object に渡さないと多重投稿が起きる
$chatlist | Foreach-Object{$params = @{body=@{content = "message"}}; New-MgBetaUserChatMessage -UserId $selfUserId -ChatId $_.Id -BodyParameter $params}
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする