다음을 통해 공유


PowerShell을 사용하여 교대 근무를 UKG Pro Workforce Management에 연결

개요

UKG Pro Workforce Management용 Microsoft Teams Shifts 커넥터를 사용하여 Microsoft Teams의 Shifts 앱을 UKG Pro WFM(UKG Pro Workforce Management)과 통합합니다. 최전방 작업자는 Shifts 내에서 UKG Pro WFM에서 일정을 원활하게 보고 관리할 수 있습니다.

이 문서에서는 PowerShell을 사용하여 Shifts를 UKG Pro WFM과 통합하도록 커넥터를 설정하고 구성하는 방법을 안내합니다.

연결을 설정하려면 PowerShell 스크립트를 실행합니다. 이 스크립트는 커넥터를 구성하고, 동기화 설정을 적용하고, 연결을 만들고, UKG Pro WFM 인스턴스(WFM 인스턴스라고도 함)를 Teams의 팀에 매핑합니다. 동기화 설정은 Shifts에서 사용하도록 설정된 기능과 UKG Pro WFM과 Shifts 간에 동기화되는 일정 정보를 결정합니다. 매핑은 Teams에서 WFM 인스턴스와 팀 간의 동기화 관계를 정의합니다. 기존 팀과 새 팀에 매핑할 수 있습니다.

두 가지 스크립트를 제공합니다. 기존 팀에 매핑할지 아니면 매핑할 새 팀을 생성할지 여부에 따라 두 스크립트 중 하나를 사용할 수 있습니다.

각각 다른 동기화 설정으로 여러 연결을 설정할 수 있습니다. 예를 들어 조직에 일정 요구 사항이 다른 여러 위치가 있는 경우 각 위치에 대해 고유한 동기화 설정을 사용하여 연결을 만듭니다. WFM 인스턴스는 지정된 시간에 한 팀에만 매핑할 수 있습니다. 인스턴스가 이미 팀에 매핑되어 있으면 다른 팀에 매핑할 수 없습니다.

UKG Pro WFM을 기록 시스템으로 사용하면 최전방 작업자가 디바이스의 Shifts에서 일정 및 가용성을 효율적으로 관리할 수 있습니다. 최전방 관리자는 UKG Pro WFM을 계속 사용하여 일정을 설정할 수 있습니다.

참고

Microsoft 365 관리 센터에서 Shifts 커넥터 마법사 를 사용하여 Shifts를 UKG Pro WFM에 연결할 수도 있습니다.

시작하기 전에

필수 구성 요소

시간을 내어 정보를 검토하고 UKG Pro Workforce Management용 Teams Shifts 커넥터에 대한 필수 구성 요소 및 요구 사항의 모든 필수 구성 요소 및 구성 작업을 완료합니다.

이 문서의 단계를 따르기 전에 모든 작업을 완료해야 합니다.

PowerShell을 사용하여 커넥터를 관리하는 관리자 역할

이 문서의 단계를 완료하려면 Microsoft 365 전역 관리자 또는 Shifts 커넥터 관리자여야 합니다.

Shifts 커넥터 관리자 역할은 Microsoft Entra ID에서 만들고 사용자에게 할당하는 사용자 지정 역할입니다. 역할 이름은 "Shifts connector admin"이어야 합니다. 역할에 특정 권한이 없어도 되지만 생성할 때 최소한 하나의 권한을 설정해야 합니다. 서비스는 권한이 아니라 사용자에 대한 역할의 존재 여부에 의존합니다.

자세한 내용은 Microsoft Entra ID에서 사용자 지정 역할 만들기 및 할당사용자에게 Microsoft Entra 역할 할당을 참조하세요. 역할이 생성되어 사용자에게 적용되는 데 최대 24시간이 걸릴 수 있습니다.

중요

사용 권한이 가장 적은 역할을 사용하는 것이 좋습니다. 이렇게 하면 조직의 보안을 개선하는 데 도움이 됩니다. 전역 관리자는 권한이 낮은 역할을 사용할 수 없는 경우 긴급 시나리오로 제한해야 하는 매우 권한 있는 역할입니다.

환경 설정

  1. PowerShell 버전 7 이상을 설치합니다. 단계별 지침은 Windows에 PowerShell 설치를 참조하세요.

  2. 관리자 모드에서 PowerShell을 실행합니다.

  3. Microsoft Graph PowerShell 모듈을 설치합니다.

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

    버전 1.6.1 이상인지 확인하십시오.

    Get-InstalledModule Microsoft.Graph 
    
  4. Teams Preview PowerShell 모듈을 설치합니다.

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

    버전이 4.7.0 이상이고 Shifts 커넥터 cmdlet이 포함되어 있는지 확인합니다.

    Get-Command -Module MicrosoftTeams -Name *teamsshiftsconnection* 
    
  5. 스크립트를 실행할 때 오류가 발생하면 종료되도록 PowerShell을 설정합니다.

    $ErrorActionPreference = "Stop" 
    
  6. Windows에서 실행할 스크립트를 활성화합니다.

    Set-ExecutionPolicy bypass 
    

Teams에 연결

다음을 실행하여 Microsoft Teams에 연결합니다.

Connect-MicrosoftTeams

메시지가 표시되면 관리자 자격 증명을 사용하여 로그인합니다. 이제 이 문서의 스크립트와 Shifts 커넥터 cmdlet을 실행하도록 설정되었습니다.

매핑하려는 팀 식별

참고

WFM 인스턴스를 기존 팀에 매핑하는 경우 이 단계를 완료합니다. 매핑할 새 팀을 만드는 경우 이 단계를 건너뛸 수 있습니다.

Azure Portal에서 모든 그룹 페이지로 이동하여 조직 내 팀의 TeamId 목록을 가져옵니다.

매핑하려는 팀의 TeamId를 기록해 둡니다. 스크립트는 이 정보를 입력하라는 메시지를 표시합니다.

참고

하나 이상의 팀에 기존 일정이 있는 경우 스크립트는 해당 팀에서 일정을 제거합니다. 그렇지 않으면 중복 교대조가 표시됩니다.

스크립트 실행

새 팀을 만들거나 기존 팀에 매핑하는지에 따라 다음 스크립트 중 하나를 실행합니다.

  • 연결을 설정하려면 Teams에서 새 팀을 만들고 WFM 인스턴스를 새 팀에 매핑하고 새 팀 스크립트를 실행합니다.
  • 연결을 설정하고 WFM 인스턴스를 Teams의 기존 팀에 매핑하려면 기존 팀 스크립트를 실행합니다.

스크립트를 실행할 때 화면의 지침을 따릅니다. 스크립트는 다음 작업을 완료합니다.

  1. 입력한 UKG Pro WFM 서비스 계정 자격 증명 및 서비스 URL을 사용하여 UKG Pro WFM에 대한 연결을 테스트하고 확인합니다.

  2. 동기화 설정을 적용합니다. 이러한 설정에는 동기화 빈도(분)와 UKG Pro WFM과 Shifts 간에 동기화된 일정 데이터가 포함됩니다. , 등의 OfferShiftRequestTimeOffRequestSwapRequestTimeOffUserShiftPreferencesOpenShiftRequestOpenShift시나리오Shift에서 정의된 일정 데이터를 사용하도록 설정할 수 있습니다.

    자세한 내용은 New-CsTeamsShiftsConnectionInstance를 참조하세요. 각 매개 변수에 지원되는 동기화 옵션 목록을 보려면 Get-CsTeamsShiftsConnectionConnector를 실행하세요.

    참고

    스크립트는 지원되는 각 동기화 옵션에 대해 동기화를 사용하도록 설정합니다. 동기화 설정을 변경하려면 연결이 설정된 후에 변경할 수 있습니다. 자세한 내용은 PowerShell을 사용하여 UKG Pro Workforce Management에 대한 Shifts 연결 관리를 참조하세요.

  3. Teams의 팀에 WFM 인스턴스를 매핑합니다.

    • 새 팀을 만들기 위해 새 팀 스크립트를 실행하도록 선택한 경우 매핑은 사용자가 만든 새 팀을 기반으로 합니다.
    • 기존 팀 스크립트를 실행하여 기존 팀을 매핑하도록 선택한 경우 매핑은 입력한 WFM 인스턴스 ID 및 TeamId를 기반으로 합니다. 팀에 기존 일정이 있는 경우 스크립트는 모든 일정 데이터를 제거합니다.

스크립트를 실행하면 연결이 성공적으로 설정되었는지 확인하는 성공 메시지가 표시됩니다.

연결 관리

연결이 설정되면 Microsoft 365 관리 센터에서 또는 PowerShell을 사용하여 관리하고 변경할 수 있습니다.

Microsoft 365 관리 센터 사용

커넥터 관리 페이지에는 설정한 각 연결과 상태 및 동기화 간격 세부 정보와 같은 정보가 나열됩니다. 마법사에 액세스하여 연결을 변경할 수도 있습니다. 예를 들어 동기화 설정 및 팀 매핑을 업데이트할 수 있습니다.

자세한 내용은 Microsoft 365 관리 센터를 사용하여 UKG Pro Workforce Management에 대한 Shifts 연결 관리를 참조하세요.

PowerShell 사용

PowerShell을 사용하여 오류 보고서를 보고, 연결 설정을 변경하고, 동기화를 사용하지 않도록 설정하는 등의 작업을 수행할 수 있습니다. 단계별 지침은 PowerShell을 사용하여 UKG Pro Workforce Management에 대한 Shifts 연결 관리를 참조하세요.

스크립트

연결 설정 및 새 팀 만들기

#Map WFM instances 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
Write-Output "Listing connector types available"
$UkgId = "95BF2848-2DDA-4425-B0EE-D62AEED4C0A0"
$connectors = Get-CsTeamsShiftsConnectionConnector
Write-Output $connectors
$Ukg = $connectors | Where-Object {$_.Id -match $UkgId}
if ($NULL -eq $Ukg) {
    throw "UKG Dimensions not currently supported"
}

#Prompt for entering of WFM username and password
$WfmUserName = Read-Host -Prompt 'Input your UKG account username'
$WfmPwd = Read-Host -Prompt 'Input your UKG 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'
$apiUrl = Read-Host -Prompt 'Input connector api url'
$ssoUrl = Read-Host -Prompt 'Input connector sso url'
$clientId = Read-Host -Prompt 'Input connector client id'
$AppKey = Read-Host -Prompt 'Input your app key' -AsSecureString
$plainKey =[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($AppKey))
$ClientSecret = Read-Host -Prompt 'Input your client secret' -AsSecureString
$plainSecret =[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($ClientSecret))

$testResult = Test-CsTeamsShiftsConnectionValidate `
    -Name $ConnectionName `
    -ConnectorId $UkgId `
    -ConnectorSpecificSettings (New-Object Microsoft.Teams.ConfigAPI.Cmdlets.Generated.Models.ConnectorSpecificUkgDimensionsSettingsRequest `
        -Property @{
            apiUrl = $apiUrl
            ssoUrl = $ssoUrl
            appKey = $plainKey
            clientId = $clientId
            clientSecret = $plainSecret
            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 $UkgId `
    -ConnectorSpecificSettings (New-Object Microsoft.Teams.ConfigAPI.Cmdlets.Generated.Models.ConnectorSpecificUkgDimensionsSettingsRequest `
        -Property @{
            apiUrl = $apiUrl
            ssoUrl = $ssoUrl
            appKey = $plainKey
            clientId = $clientId
            clientSecret = $plainSecret
            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" }
    }
}
$SyncScenarioOfferShiftRequest = GetSyncScenarioSetting "Offer Shift Request"
$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 `
    -SyncScenarioOfferShiftRequest $SyncScenarioOfferShiftRequest `
    -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

연결 설정 및 기존 팀 매핑

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

#Ensure Teams module is at least version x
Write-Host "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
Write-Output "Listing connector types available"
$UkgId = "95BF2848-2DDA-4425-B0EE-D62AEED4C0A0"
$connectors = Get-CsTeamsShiftsConnectionConnector
Write-Output $connectors
$Ukg = $connectors | Where-Object {$_.Id -match $UkgId}
if ($NULL -eq $Ukg) {
    throw "UKG Dimensions not currently supported"
}

#Prompt for entering of WFM username and password
$WfmUserName = Read-Host -Prompt 'Input your UKG account username'
$WfmPwd = Read-Host -Prompt 'Input your UKG 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'
$apiUrl = Read-Host -Prompt 'Input connector api url'
$ssoUrl = Read-Host -Prompt 'Input connector sso url'
$clientId = Read-Host -Prompt 'Input connector client id'
$AppKey = Read-Host -Prompt 'Input your app key' -AsSecureString
$plainKey =[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($AppKey))
$ClientSecret = Read-Host -Prompt 'Input your client secret' -AsSecureString
$plainSecret =[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($ClientSecret))

$testResult = Test-CsTeamsShiftsConnectionValidate `
    -Name $ConnectionName `
    -ConnectorId $UkgId `
    -ConnectorSpecificSettings (New-Object Microsoft.Teams.ConfigAPI.Cmdlets.Generated.Models.ConnectorSpecificUkgDimensionsSettingsRequest `
        -Property @{
            apiUrl = $apiUrl
            ssoUrl = $ssoUrl
            appKey = $plainKey
            clientId = $clientId
            clientSecret = $plainSecret
            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 $UkgId `
    -ConnectorSpecificSettings (New-Object Microsoft.Teams.ConfigAPI.Cmdlets.Generated.Models.ConnectorSpecificUkgDimensionsSettingsRequest `
        -Property @{
            apiUrl = $apiUrl
            ssoUrl = $ssoUrl
            appKey = $plainKey
            clientId = $clientId
            clientSecret = $plainSecret
            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" }
    }
}
$SyncScenarioOfferShiftRequest = GetSyncScenarioSetting "Offer Shift Request"
$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 `
    -SyncScenarioOfferShiftRequest $SyncScenarioOfferShiftRequest `
    -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

Shifts 커넥터 cmdlet

스크립트에 사용된 cmdlet을 포함하여 Shifts 커넥터 cmdlet에 대한 도움말을 보려면 Teams PowerShell cmdlet 참조에서 CsTeamsShiftsConnection을 검색하세요. 다음은 범주별로 그룹화된 몇 가지 일반적으로 사용되는 cmdlet에 대한 링크입니다.

Connections

WFM 시스템 자격 증명

지원되는 시나리오에 대한 동기화 옵션

일정 데이터 제거

연결 인스턴스

사용자 매핑 및 성공적인 동기화

팀 매핑

작업 ID

오류 보고서