Verwenden Sie PowerShell, um Ihre Schichten mit Blue Yonder Workforce Management zu verbinden

Übersicht

Verwenden Sie den Microsoft Teams Schichten-Connector für Blue Yonder, um die Schichten-App in Microsoft Teams in Blue Yonder Workforce Management (Blue Yonder WFM) zu integrieren. Ihre Mitarbeiter in Service und Produktion können ihre Zeitpläne nahtlos in Blue Yonder WFM innerhalb von Schichten anzeigen und verwalten.

In diesem Artikel führen wir Sie durch die Verwendung von PowerShell zum Einrichten und Konfigurieren des Connectors zur Integration von Schichten in Blue Yonder WFM.

Zum Einrichten der Verbindung führen Sie ein PowerShell-Skript aus. Das Skript konfiguriert den Connector, wendet Synchronisierungseinstellungen an, erstellt die Verbindung und ordnet Blue Yonder WFM Instanzen Teams zu. Die Synchronisierungseinstellungen bestimmen die in Schichten aktivierten Features und die Zeitplaninformationen, die zwischen Blue Yonder WFM und Schichten synchronisiert werden. Zuordnungen definieren die Synchronisierungsbeziehung zwischen Ihren Blue Yonder WFM-Instanzen und Teams in Teams. Sie können zu vorhandenen Teams und neuen Teams zuordnen.

Wir stellen zwei Skripts bereit. Sie können entweder ein Skript verwenden, je nachdem, ob Sie vorhandenen Teams zuordnen möchten, oder neue Teams erstellen möchten, die zugeordnet werden sollen.

Sie können mehrere Verbindungen mit jeweils unterschiedlichen Synchronisierungseinstellungen einrichten. Wenn Ihre Organisation beispielsweise über mehrere Standorte mit unterschiedlichen Zeitplananforderungen verfügt, erstellen Sie eine Verbindung mit eindeutigen Synchronisierungseinstellungen für jeden Standort. Denken Sie daran, dass eine Blue Yonder WFM-Instanz nur einem Team zu einem bestimmten Zeitpunkt zugeordnet werden kann. Wenn eine Instanz bereits einem Team zugeordnet ist, kann sie keinem anderen Team zugeordnet werden.

Mit Blue Yonder WFM als Aufzeichnungssystem können Ihre Mitarbeiter in Service und Produktion ihre Zeitpläne und Verfügbarkeit in Schichten auf ihren Geräten effizient verwalten. Vorgesetzte von Mitarbeitern in Service und Produktion können weiterhin Blue Yonder WFM verwenden, um Zeitpläne einzurichten.

Hinweis

Sie können auch den Schichten-Connector-Assistenten im Microsoft 365 Admin Center verwenden, um Schichten mit Blue Yonder WFM zu verbinden.

Bevor Sie beginnen

Voraussetzungen

Bevor Sie beginnen, stellen Sie sicher, dass sie alle folgenden Voraussetzungen erfüllen:

  • Sie verfügen über Blue Yonder WFM Version 2020.3, 2021.1 oder 2021.2.

    Hinweis

    Wenn Sie Blue Yonder WFM 2020.3 oder 2021.1 haben, wenden Sie den Patch 2020.3.0.4 oder 2021.1.0.3 an. Dieser Patch behebt ein Problem, bei dem Benutzer eine dauerhafte Fehlermeldung in Schichten erhalten. Außerdem wird ein Problem behoben, das verhindert, dass Benutzer ihre Verfügbarkeit in Schichten aktualisieren.

  • Sie kennen den Namen, das Kennwort und die Dienst-URLs Ihres Blue Yonder-WFM-Dienstkontos:

    • URL zur Verbundauthentifizierung
    • Cookieauthentifizierungs-URL
    • Employee Self-Service-URL
    • URL der Einzelhandels Web-API
    • URL der Website-Manager-API
    • Verwaltungs-API-URL

    Wenn Sie nicht über alle diese Informationen verfügen, wenden Sie sich an den Blue Yonder-Support. Ein Blue Yonder-Konto wird auf Der Stammunternehmensebene von einem Blue Yonder-Unternehmensadministrator erstellt. Sie muss über API-Zugriff, Client Admin, Store Manager und Workerzugriff verfügen. Das Konto und das Kennwort sind erforderlich, um eine Verbindung zu erstellen.

  • Die Verbund-SSO-Authentifizierung ist in Ihrer Blue Yonder WFM-Umgebung aktiviert. Wenden Sie sich an den Blue Yonder-Support, um sicherzustellen, dass das Verbund-SSO aktiviert ist. Sie benötigen die folgenden Informationen:

    • federatedSSOValidationService: https://wfmconnector.teams.microsoft.com/api/v1/fedauth/{tenantId}/6A51B888-FF44-4FEA-82E1-839401E9CD74/authorize Dabei {tenantId} ist Ihre tenantId
    • proxyHeader: X-MS-AuthToken
  • Sie haben mindestens ein Team in Teams eingerichtet.

  • Sie haben allen Teams, die Sie zuordnen möchten, als Teambesitzer ein allgemeines Konto (das microsoft 365-Systemkonto) hinzugefügt.

    Erstellen Sie dieses Konto im Microsoft 365 Admin Center, und weisen Sie ihm eine Microsoft 365-Lizenz zu. Fügen Sie dann das Konto als Teambesitzer allen Teams hinzu, die Sie zuordnen möchten. Der Schichten-Connector verwendet dieses Konto, wenn Schichten von Blue Yonder WFM synchronisiert werden. Es wird empfohlen, ein Konto speziell für diesen Zweck zu erstellen und ihr persönliches Benutzerkonto nicht zu verwenden.

Administratorrolle zum Verwalten des Connectors mithilfe von PowerShell

Sie müssen ein globaler Microsoft 365-Administrator oder ein Shifts-Connectoradministrator sein, um die Schritte in diesem Artikel ausführen zu können.

Die Administratorrolle des Shifts-Connectors ist eine benutzerdefinierte Rolle, die Sie in Microsoft Entra ID erstellen und einem Benutzer zuweisen. Der Name der Rolle muss „Schichten-Connector-Administrator“ sein. Die Rolle muss keine bestimmten Berechtigungen besitzen, allerdings muss beim Erstellen mindestens eine Berechtigung festgelegt werden. Der Dienst basiert darauf, dass der Benutzer über die Rolle verfügt, und ist nicht von den Berechtigungen abhängig.

Weitere Informationen finden Sie unter Erstellen und Zuweisen einer benutzerdefinierten Rolle in Microsoft Entra-ID und Zuweisen Microsoft Entra Rollen zu Benutzern. Beachten Sie, dass es bis zu 24 Stunden dauern kann, bis die Rolle erstellt und auf einen Benutzer angewendet wird.

Einrichten der Umgebung

  1. Installieren Sie PowerShell, Version 7 oder höher. Eine schrittweise Anleitung finden Sie unter Installieren von PowerShell unter Windows.

  2. Führen Sie PowerShell im Administratormodus aus.

  3. Installieren Sie das Microsoft Graph PowerShell-Modul.

    Install-Module Microsoft.Graph
    Import-Module Microsoft.Graph
    

    Vergewissern Sie sich, dass es sich um Version 1.6.1 oder höher handelt.

    Get-InstalledModule Microsoft.Graph 
    
  4. Installieren Sie das PowerShell-Modul der Microsoft Teams-Vorschauversion.

    Install-Module -Name MicrosoftTeams -AllowPrerelease -Force
    Import-Module MicrosoftTeams 
    

    Vergewissern Sie sich, dass es mindestens Version 4.7.0 ist und die Shifts-Connector-Cmdlets enthält.

    Get-Command -Module MicrosoftTeams -Name *teamsshiftsconnection* 
    
  5. Legen Sie fest, dass PowerShell beendet wird, wenn beim Ausführen des Skripts ein Fehler auftritt.

    $ErrorActionPreference = "Stop" 
    
  6. Aktivieren Sie die Ausführung von Skripts in Windows.

    Set-ExecutionPolicy bypass 
    

Mit Teams verbinden

Führen Sie Folgendes aus, um eine Verbindung mit Teams herzustellen.

Connect-MicrosoftTeams

Wenn Sie dazu aufgefordert werden, melden Sie sich mit Ihren Administratoranmeldeinformationen an. Sie sind jetzt für die Ausführung der Skripts in diesem Artikel und der Shifts-Connector-Cmdlets eingerichtet.

Identifizieren der Teams, die Sie zuordnen möchten

Hinweis

Führen Sie diesen Schritt aus, wenn Sie Blue Yonder WFM-Instanzen vorhandenen Teams zuordnen. Wenn Sie neue Teams für die Zuordnung erstellen, können Sie diesen Schritt überspringen.

Wechseln Sie im Azure-Portal zur Seite Alle Gruppen, um eine Liste der Team-IDs von Teams in Ihrer Organisation abzurufen.

Notieren Sie sich die Team-IDs der Teams, die Sie zuordnen möchten. Das Skript fordert Sie auf, diese Informationen einzugeben.

Hinweis

Wenn ein oder mehrere Teams über einen vorhandenen Zeitplan verfügen, entfernt das Skript die Zeitpläne aus diesen Teams. Andernfalls werden doppelte Schichten angezeigt.

Ausführen des Skripts

Führen Sie eines der folgenden Skripts aus, je nachdem, ob Sie ein neues Team erstellen oder einem vorhandenen Team zuordnen:

  • Um eine Verbindung einzurichten, erstellen Sie ein neues Team in Teams, und ordnen Sie dem neuen Team eine Blue Yonder-WFM instance zu, führen Sie das neue Teams-Skript aus.
  • Führen Sie das vorhandene Teams-Skript aus, um eine Verbindung einzurichten und Blue Yonder WFM-Instanzen vorhandenen Teams in Teams zuzuordnen.

Befolgen Sie die Anweisungen auf dem Bildschirm, wenn Sie das Skript ausführen. Das Skript schließt die folgenden Aktionen ab:

  1. Testen und überprüfen Sie die Verbindung mit Blue Yonder WFM mithilfe der Von Ihnen eingegebenen Anmeldeinformationen und Dienst-URLs des Dienstkontos von Blue Yonder WFM.

  2. Wenden Sie Synchronisierungseinstellungen an. Diese Einstellungen umfassen die Synchronisierungshäufigkeit (in Minuten) und die Zeitplandaten, die zwischen Blue Yonder WFM und Schichten synchronisiert werden. Sie können Zeitplandaten aktivieren, die durch die folgenden Szenarien definiert werden: Shift, SwapRequestUserShiftPreferences, OpenShift, OpenShiftRequest, TimeOff, . TimeOffRequest

    Weitere Informationen finden Sie unter New-ClassificationRuleCollection. Um die Liste der unterstützten Synchronisierungsoptionen für jeden Parameter anzuzeigen, führen Sie Get-CsTeamsShiftsConnectionConnector aus.

    Hinweis

    Das Skript aktiviert die Synchronisierung für jede unterstützte Synchronisierungsoption. Wenn Sie die Synchronisierungseinstellungen ändern möchten, können Sie dies tun, nachdem die Verbindung eingerichtet wurde. Weitere Informationen finden Sie unter Verwenden von PowerShell zum Verwalten Ihrer Schichten-Verbindung mit Blue Yonder Workforce Management.

  3. Ordnen Sie Blue Yonder WFM-Instanzen Ihren Teams in Teams zu.

    • Wenn Sie sich für die Ausführung des neuen Teams-Skripts entschieden haben, um neue Teams zu erstellen, basieren die Zuordnungen auf den neuen Teams, die Sie erstellen.
    • Wenn Sie das vorhandene Teams-Skript ausführen möchten, um vorhandene Teams zuzuordnen, basieren Zuordnungen auf Blue Yonder instance IDs und Team-IDs, die Sie eingeben. Wenn ein Team über einen vorhandenen Zeitplan verfügt, entfernt das Skript alle Zeitplandaten.

Nachdem Sie das Skript ausgeführt haben, wird in einer Erfolgsmeldung bestätigt, ob Die Verbindung erfolgreich eingerichtet wurde.

Verwalten der Verbindung

Nachdem eine Verbindung eingerichtet wurde, können Sie sie im Microsoft 365 Admin Center oder mithilfe von PowerShell verwalten und ändern.

Verwenden des Microsoft 365 Admin Center

Auf der Seite Connectorverwaltung werden jede Verbindung, die Sie eingerichtet haben, sowie Informationen wie Integritäts- status und Details zum Synchronisierungsintervall aufgelistet. Sie können auch auf den Assistenten zugreifen, um Änderungen an Ihren Verbindungen vorzunehmen. Beispielsweise können Sie Synchronisierungseinstellungen und Teamzuordnungen aktualisieren.

Weitere Informationen finden Sie unter Verwenden der Microsoft 365 Admin Center zum Verwalten ihrer Schichten-Verbindung mit Blue Yonder Workforce Management.

PowerShell verwenden

Sie können PowerShell verwenden, um einen Fehlerbericht anzuzeigen, Verbindungseinstellungen zu ändern, die Synchronisierung zu deaktivieren und vieles mehr. Eine detaillierte Anleitung finden Sie unter Verwenden von PowerShell zum Verwalten Ihrer Schichten-Verbindung mit Blue Yonder Workforce Management.

Skripts

Einrichten einer Verbindung und Erstellen eines neuen Teams

#Map WFM sites to teams script
Write-Output "Map WFM sites to teams"
Start-Sleep 1

#Ensure Teams module is at least version x
Write-Output "Checking Teams module version"
try {
	Get-InstalledModule -Name "MicrosoftTeams" -MinimumVersion 5.2.0
} catch {
	throw
}

#Connect to MS Graph
Connect-MgGraph -Scopes "User.Read.All","Group.ReadWrite.All"

#List connector types available (comment out if not implemented for preview)
Write-Output "Listing connector types available"
$BlueYonderId = "6A51B888-FF44-4FEA-82E1-839401E9CD74"
$connectors = Get-CsTeamsShiftsConnectionConnector
Write-Output $connectors

#Prompt for entering of WFM username and password
$WfmUserName = Read-Host -Prompt 'Input your Blue Yonder account username'
$WfmPwd = Read-Host -Prompt 'Input your Blue Yonder account password' -AsSecureString
$plainPwd =[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($WfmPwd))

#Test connection settings
Write-Output "Testing connection settings"
$ConnectionName = Read-Host -Prompt 'Input connection name'
$adminApiUrl = Read-Host -Prompt 'Input admin api url'
$cookieAuthUrl = Read-Host -Prompt 'Input cookie authorization url'
$essApiUrl = Read-Host -Prompt 'Input ess api url'
$federatedAuthUrl = Read-Host -Prompt 'Input federated authorization url'
$retailWebApiUrl = Read-Host -Prompt 'Input retail web api url'
$siteManagerUrl = Read-Host -Prompt 'Input site manager url'

$testResult = Test-CsTeamsShiftsConnectionValidate `
	-Name $ConnectionName `
	-ConnectorId $BlueYonderId `
    -ConnectorSpecificSettings (New-Object Microsoft.Teams.ConfigAPI.Cmdlets.Generated.Models.ConnectorSpecificBlueYonderSettingsRequest `
        -Property @{
            AdminApiUrl = $adminApiUrl
            SiteManagerUrl = $siteManagerUrl
            EssApiUrl = $essApiUrl
            RetailWebApiUrl = $retailWebApiUrl
            CookieAuthUrl = $cookieAuthUrl
            FederatedAuthUrl = $federatedAuthUrl
            LoginUserName = $WfmUserName
            LoginPwd = $plainPwd
        })
if ($NULL -ne $testResult.Code) {
	Write-Output $testResult
	throw "Validation failed, conflict found"
}
Write-Output "Test complete, no conflicts found"

#Create a connection
Write-Output "Creating a connection"
$ConnectionResponse = New-CsTeamsShiftsConnection `
    -Name $ConnectionName `
    -ConnectorId $BlueYonderId `
    -ConnectorSpecificSettings (New-Object Microsoft.Teams.ConfigAPI.Cmdlets.Generated.Models.ConnectorSpecificBlueYonderSettingsRequest `
		-Property @{
			AdminApiUrl = $adminApiUrl
			SiteManagerUrl = $siteManagerUrl
			EssApiUrl = $essApiUrl
			RetailWebApiUrl = $retailWebApiUrl
			CookieAuthUrl = $cookieAuthUrl
			FederatedAuthUrl = $federatedAuthUrl
			LoginUserName = $WfmUserName
			LoginPwd = $plainPwd
		})

$ConnectionId = $ConnectionResponse.Id
if ($null -ne $ConnectionId){
	Write-Output "Successfully created connection"
} else {
	throw "Connection creation failed"
}

#Create a connection instance
Write-Output "Creating a connection instance"
$designatedActorName = Read-Host -Prompt "Input Microsoft 365 System Account (person@contoso.com)"
$designator = Get-MgUser -UserId $designatedActorName
$teamsUserId = $designator.Id
$syncFreq = Read-Host -Prompt "Input sync frequency in minutes"
$InstanceName = Read-Host -Prompt "Input connection instance name"

#Read sync scenarios for connection instance
function GetSyncScenarioSetting {
	param (
		$SettingName
	)
	$TwoWay = New-Object System.Management.Automation.Host.ChoiceDescription '&TwoWay', 'TwoWay'
	$Disabled = New-Object System.Management.Automation.Host.ChoiceDescription '&Disabled', 'Disabled'
	$FromWfmToShifts = New-Object System.Management.Automation.Host.ChoiceDescription '&FromWfmToShifts', 'FromWfmToShifts'
	$options = [System.Management.Automation.Host.ChoiceDescription[]]($TwoWay, $Disabled, $FromWfmToShifts)
	$result = $host.ui.PromptForChoice("Set sync scenario for $SettingName", "", $options, 0)

	switch ($result)
	{
		0 { return "TwoWay" }
		1 { return "Disabled" }
		2 { return "FromWfmToShifts" }
	}
}
$SyncScenarioOpenShift = GetSyncScenarioSetting "Open Shift"
$SyncScenarioOpenShiftRequest = GetSyncScenarioSetting "Open Shift Request"
$SyncScenarioShift = GetSyncScenarioSetting "Shift"
$SyncScenarioSwapRequest = GetSyncScenarioSetting "Swap Request"
$SyncScenarioTimeCard = GetSyncScenarioSetting "Time Card"
$SyncScenarioTimeOff = GetSyncScenarioSetting "Time Off"
$SyncScenarioTimeOffRequest = GetSyncScenarioSetting "Time Off Request"
$SyncScenarioUserShiftPreference = GetSyncScenarioSetting "User Shift Preferences"

#Read admin email list
[psobject[]]$AdminEmailList = @()
while ($true){
	$AdminEmail = Read-Host -Prompt "Enter admin's email to receive error report"
	$AdminEmailList += $AdminEmail
	$title    = 'Adding another email'
	$question = 'Would you like to add another admin email?'
	$choices  = '&Yes', '&No'
	$decision = $Host.UI.PromptForChoice($title, $question, $choices, 1)
	if ($decision -eq 1) {
		break
	}
}
$InstanceResponse = New-CsTeamsShiftsConnectionInstance `
	-ConnectionId $ConnectionId `
    -ConnectorAdminEmail $AdminEmailList `
    -DesignatedActorId $teamsUserId `
    -Name $InstanceName `
    -SyncFrequencyInMin $syncFreq `
	-SyncScenarioOpenShift $SyncScenarioOpenShift `
	-SyncScenarioOpenShiftRequest $SyncScenarioOpenShiftRequest `
	-SyncScenarioShift $SyncScenarioShift `
	-SyncScenarioSwapRequest $SyncScenarioSwapRequest `
	-SyncScenarioTimeCard $SyncScenarioTimeCard `
	-SyncScenarioTimeOff $SyncScenarioTimeOff `
	-SyncScenarioTimeOffRequest $SyncScenarioTimeOffRequest `
	-SyncScenarioUserShiftPreference $SyncScenarioUserShiftPreference

$InstanceId = $InstanceResponse.id
if ($null -ne $InstanceId){
    Write-Output "Success"
} else {
    throw "Connector instance creation failed"
}

#Keep mapping teams until user stops it
$mappings=@()
while ($true)
{
	#Create a new Teams team with owner set to system account and name set to the site name
	Write-Output "Creating a Teams team"
	$teamsTeamName = Read-Host -Prompt "Input the Teams team name"
	$Team = New-Team -DisplayName $teamsTeamName -Visibility "Public" -Owner $teamsUserId
	Write-Output "Successfully created a team"
	$TeamsTeamId=$Team.GroupId

	#Retrieve the list of wfm locations
	Write-Output "Listing the WFM team sites"
	$WfmTeamIds = Get-CsTeamsShiftsConnectionWfmTeam -ConnectorInstanceId $InstanceId
	Write-Output $WfmTeamIds
	if (($NULL -ne $WfmTeamIds) -and ($WfmTeamIds.Count -gt 0)){
		[System.String]$WfmTeamId = Read-Host -Prompt "Input the ID of WFM team you want to map"
	}
	else {
		throw "The WfmTeamId list is null or empty"
	}

	#Retrieve the list of WFM users and their roles
	Write-Output "Listing WFM users and roles"
	$WFMUsers = Get-CsTeamsShiftsConnectionWfmUser -ConnectorInstanceId $InstanceId -WfmTeamId $WfmTeamId
	Write-Output $WFMUsers

	#Add users to the Team for Shifts
	Write-Output "Adding users to Teams team"
	$currentUser = Read-Host -Prompt "Input the current user's user name or AAD ID"
	Add-TeamUser -GroupId $TeamsTeamId -User $currentUser -Role Owner
	$failedWfmUsers=@()
	foreach ($user in $WFMUsers) {
		try {
		$userEmail = $user.Name + "@" +$domain
		Add-TeamUser -GroupId $TeamsTeamId -User $userEmail
		} catch {
			$failedWfmUsers+=$user
		}
	}
	if($failedWfmUsers.Count -gt 0){
		Write-Output "There are WFM users not existed in Teams tenant:"
		Write-Output $failedWfmUsers
	}

	#Enable scheduling in the group
	$RequestBody = @{
		Enabled = $true
		TimeZone = "America/Los_Angeles"
	}
	$teamUpdateUrl="https://graph.microsoft.com/v1.0/teams/"+$TeamsTeamId+"/schedule"
	Invoke-MgGraphRequest -Uri $teamUpdateUrl -Method PUT -Body $RequestBody

	#Create a mapping of the new team to the instance
	Write-Output "Create a mapping of the new team to the site"
	$TimeZone = Read-Host -Prompt "Input the time zone of team mapping"
	$mapping = @{
		teamId = $TeamsTeamId
		wfmTeamId = $WfmTeamId
		timeZone = $TimeZone
		}
	$mappings += , $mapping

	$title    = 'Connecting another team'
	$question = 'Would you like to connect another team?'
	$choices  = '&Yes', '&No'

	$decision = $Host.UI.PromptForChoice($title, $question, $choices, 1)
	if ($decision -eq 1) {
		break
	}
}
$batchMappingResponse = New-CsTeamsShiftsConnectionBatchTeamMap -ConnectorInstanceId $InstanceId -TeamMapping @($mappings)
if ($null -ne $batchMappingResponse.OperationId){
	"The mapping has begun asynchronously. To query mapping results run Get-CsTeamsShiftsConnectionOperation with the operation Id."
}
else {
	throw "The mapping has failed due to validation errors."
}
Write-Output $batchMappingResponse

Remove-TeamUser -GroupId $TeamsTeamId -User $currentUser -Role Owner
Disconnect-MgGraph

Einrichten einer Verbindung und Zuordnen eines vorhandenen Teams

#Map WFM sites to existing teams script
Write-Output "Map WFM sites to existing teams"
Start-Sleep 1

#Ensure Teams module is at least version x
Write-Output "Checking Teams module version"
try {
	Get-InstalledModule -Name "MicrosoftTeams" -MinimumVersion 5.2.0
} catch {
	throw
}

#Connect to MS Graph
Connect-MgGraph -Scopes "User.Read.All","Group.ReadWrite.All"

#List connector types available (comment out if not implemented for preview)
Write-Output "Listing connector types available"
$BlueYonderId = "6A51B888-FF44-4FEA-82E1-839401E9CD74"
$connectors = Get-CsTeamsShiftsConnectionConnector
Write-Output $connectors

#Prompt for entering of WFM username and password
$WfmUserName = Read-Host -Prompt 'Input your Blue Yonder account username'
$WfmPwd = Read-Host -Prompt 'Input your Blue Yonder account password' -AsSecureString
$plainPwd =[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($WfmPwd))

#Test connection settings
Write-Output "Testing connection settings"
$ConnectionName = Read-Host -Prompt 'Input connection name'
$adminApiUrl = Read-Host -Prompt 'Input admin api url'
$cookieAuthUrl = Read-Host -Prompt 'Input cookie authorization url'
$essApiUrl = Read-Host -Prompt 'Input ess api url'
$federatedAuthUrl = Read-Host -Prompt 'Input federated authorization url'
$retailWebApiUrl = Read-Host -Prompt 'Input retail web api url'
$siteManagerUrl = Read-Host -Prompt 'Input site manager url'

$testResult = Test-CsTeamsShiftsConnectionValidate `
	-Name $ConnectionName `
	-ConnectorId $BlueYonderId `
	-ConnectorSpecificSettings (New-Object Microsoft.Teams.ConfigAPI.Cmdlets.Generated.Models.ConnectorSpecificBlueYonderSettingsRequest `
		-Property @{
			AdminApiUrl = $adminApiUrl
			SiteManagerUrl = $siteManagerUrl
			EssApiUrl = $essApiUrl
			RetailWebApiUrl = $retailWebApiUrl
			CookieAuthUrl = $cookieAuthUrl
			FederatedAuthUrl = $federatedAuthUrl
			LoginUserName = $WfmUserName
			LoginPwd = $plainPwd
		})
		
if ($NULL -ne $testResult.Code) {
	Write-Output $testResult
	throw "Validation failed, conflict found"
}
Write-Host "Test complete, no conflicts found"

#Create a connection
Write-Output "Creating a connection"
$ConnectionResponse = New-CsTeamsShiftsConnection `
    -Name $ConnectionName `
    -ConnectorId $BlueYonderId `
    -ConnectorSpecificSettings (New-Object Microsoft.Teams.ConfigAPI.Cmdlets.Generated.Models.ConnectorSpecificBlueYonderSettingsRequest `
		-Property @{
			AdminApiUrl = $adminApiUrl
			SiteManagerUrl = $siteManagerUrl
			EssApiUrl = $essApiUrl
			RetailWebApiUrl = $retailWebApiUrl
			CookieAuthUrl = $cookieAuthUrl
			FederatedAuthUrl = $federatedAuthUrl
			LoginUserName = $WfmUserName
			LoginPwd = $plainPwd
		})

$ConnectionId = $ConnectionResponse.Id
if ($null -ne $ConnectionId){
	Write-Output "Successfully created connection"
} else {
	throw "Connection creation failed"
}

#Create a connection instance
Write-Output "Creating a connection instance"
$designatedActorName = Read-Host -Prompt "Input Microsoft 365 System Account (person@contoso.com)"
$designator = Get-MgUser -UserId $designatedActorName
$teamsUserId = $designator.Id
$syncFreq = Read-Host -Prompt "Input sync frequency in minutes"
$InstanceName = Read-Host -Prompt "Input connection instance name"

#Read sync scenarios for connection instance
function GetSyncScenarioSetting {
	param (
		$SettingName
	)
	$TwoWay = New-Object System.Management.Automation.Host.ChoiceDescription '&TwoWay', 'TwoWay'
	$Disabled = New-Object System.Management.Automation.Host.ChoiceDescription '&Disabled', 'Disabled'
	$FromWfmToShifts = New-Object System.Management.Automation.Host.ChoiceDescription '&FromWfmToShifts', 'FromWfmToShifts'
	$options = [System.Management.Automation.Host.ChoiceDescription[]]($TwoWay, $Disabled, $FromWfmToShifts)
	$result = $host.ui.PromptForChoice("Set sync scenario for $SettingName", "", $options, 0)

	switch ($result)
	{
		0 { return "TwoWay" }
		1 { return "Disabled" }
		2 { return "FromWfmToShifts" }
	}
}
$SyncScenarioOpenShift = GetSyncScenarioSetting "Open Shift"
$SyncScenarioOpenShiftRequest = GetSyncScenarioSetting "Open Shift Request"
$SyncScenarioShift = GetSyncScenarioSetting "Shift"
$SyncScenarioSwapRequest = GetSyncScenarioSetting "Swap Request"
$SyncScenarioTimeCard = GetSyncScenarioSetting "Time Card"
$SyncScenarioTimeOff = GetSyncScenarioSetting "Time Off"
$SyncScenarioTimeOffRequest = GetSyncScenarioSetting "Time Off Request"
$SyncScenarioUserShiftPreference = GetSyncScenarioSetting "User Shift Preferences"

#Read admin email list
[psobject[]]$AdminEmailList = @()
while ($true){
	$AdminEmail = Read-Host -Prompt "Enter admin's email to receive error report"
	$AdminEmailList += $AdminEmail
	$title    = 'Adding another email'
	$question = 'Would you like to add another admin email?'
	$choices  = '&Yes', '&No'
	$decision = $Host.UI.PromptForChoice($title, $question, $choices, 1)
	if ($decision -eq 1) {
		break
	}
}
$InstanceResponse = New-CsTeamsShiftsConnectionInstance `
	-ConnectionId $ConnectionId `
    -ConnectorAdminEmail $AdminEmailList `
    -DesignatedActorId $teamsUserId `
    -Name $InstanceName `
    -SyncFrequencyInMin $syncFreq `
	-SyncScenarioOpenShift $SyncScenarioOpenShift `
	-SyncScenarioOpenShiftRequest $SyncScenarioOpenShiftRequest `
	-SyncScenarioShift $SyncScenarioShift `
	-SyncScenarioSwapRequest $SyncScenarioSwapRequest `
	-SyncScenarioTimeCard $SyncScenarioTimeCard `
	-SyncScenarioTimeOff $SyncScenarioTimeOff `
	-SyncScenarioTimeOffRequest $SyncScenarioTimeOffRequest `
	-SyncScenarioUserShiftPreference $SyncScenarioUserShiftPreference

$InstanceId = $InstanceResponse.id
if ($null -ne $InstanceId){
    Write-Output "Success"
} else {
    throw "Connector instance creation failed"
}

#Keep mapping teams until user stops it
$mappings=@()
while ($true)
{
	$TeamsTeamId = Read-Host -Prompt "Input the ID of the Teams team to be mapped"
	#Clear schedule of the Teams team
	Write-Host "Clear schedule of the existing team"

	$entityTypeString = Read-Host -Prompt 'Input the entity types of clear schedule'
	$Delimiters = ",", ".", ":", ";", " ", "`t"
	$entityType = $entityTypeString -Split {$Delimiters -contains $_}
	$entityType = $entityType.Trim()
	$entityType = $entityType.Split('',[System.StringSplitOptions]::RemoveEmptyEntries)
	Remove-CsTeamsShiftsScheduleRecord -TeamId $TeamsTeamId -ClearSchedulingGroup:$True -EntityType $entityType

	#Retrieve the list of wfm locations
	Write-Output "Listing the WFM team sites"
	$WfmTeamIds = Get-CsTeamsShiftsConnectionWfmTeam -ConnectorInstanceId $InstanceId
	Write-Output $WfmTeamIds
	if (($NULL -ne $WfmTeamIds) -and ($WfmTeamIds.Count -gt 0)){
		[System.String]$WfmTeamId = Read-Host -Prompt "Input the ID of WFM team you want to map"
	}
	else {
		throw "The WfmTeamId list is null or empty"
	}

	#Retrieve the list of WFM users and their roles
	Write-Output "Listing WFM users and roles"
	$WFMUsers = Get-CsTeamsShiftsConnectionWfmUser -ConnectorInstanceId $InstanceId -WfmTeamId $WfmTeamId
	Write-Output $WFMUsers

	#Create a mapping of the existing team to the instance
	Write-Host "Create a mapping of the existing team to the site"
	$TimeZone = Read-Host -Prompt "Input the time zone of team mapping"
	$mapping = @{
		teamId = $TeamsTeamId
		wfmTeamId = $WfmTeamId
		timeZone = $TimeZone
		}
	$mappings += , $mapping

	$title    = 'Connecting another team'
	$question = 'Would you like to connect another team?'
	$choices  = '&Yes', '&No'

	$decision = $Host.UI.PromptForChoice($title, $question, $choices, 1)
	if ($decision -eq 1) {
		break
	}
}
$batchMappingResponse = New-CsTeamsShiftsConnectionBatchTeamMap -ConnectorInstanceId $InstanceId -TeamMapping @($mappings)
if ($null -ne $batchMappingResponse.OperationId){
	"The mapping has begun asynchronously. To query mapping results run Get-CsTeamsShiftsConnectionOperation with the operation Id."
}
else {
	throw "The mapping has failed due to validation errors."
}
Write-Output $batchMappingResponse

Disconnect-MgGraph

Cmdlets für Schichten-Connectors

Hilfe zu Cmdlets für Schichten-Connectors, einschließlich der Cmdlets, die in den Skripts verwendet werden, finden Sie in der Microsoft Teams PowerShell-Cmdlet-Referenz nach CsTeamsShiftsConnection. Hier finden Sie Links zu einigen häufig verwendeten Cmdlets, gruppiert nach Kategorie:

Verbindungen

WFM Systemanmeldeinformationen

Synchronisierungsoptionen für unterstützte Szenarien

Entfernen von Zeitplandaten

Verbindungsinstanzen

Benutzerzuordnung und erfolgreiche Synchronisierung

Teamzuordnung

Vorgangs-ID

Fehlerberichte