Поделиться через


Устранение проблем при запуске нового приложения Teams

Симптомы

Если включить переключатель "Попробовать" в классической версии Microsoft Teams, новое приложение Teams не запускается. Вместо этого появится баннер и отображается следующее сообщение об ошибке:

Произошла ошибка.

Если проверить файл журнала для классической версии Teams, записывается следующая запись об ошибке:

message: Launch api returns false, code: 11, apiCode: undefined, extendedErrorCode: 0, launchStatus: failed, status: failure, scenario: <scenarioGUID>, scenarioName: launch_pear_app, name: launch_pear_app

Причина

Эта проблема может возникать по одной из следующих причин:

  • Папки оболочки cookie и кэша указывают на точку повторного использования.
  • Переменные среды TEMP или TMP указывают на точку повторного выполнения.
  • У вас нет разрешения на чтение для доступа к определенным папкам в папке AppData .
  • Некоторые папки в папке AppData изменяются на функцию в качестве точек повторного анализа.
  • Папка AppData содержит недопустимые файлы, которые имеют то же имя, что и необходимые системные папки.
  • Учетная запись SYSTEM и группа администраторов не имеют разрешения на полный доступ к определенным папкам в папке AppData .
  • У вас нет разрешения SYSAPPID на расположение установки Teams.
  • Параметр политики AllowAllTrustedApps предотвращает запуск новых Команд.

Разрешение

Чтобы применить соответствующее решение для этой проблемы, необходимо выполнить несколько проверок, чтобы определить причину проблемы. Существует два варианта выполнения всех необходимых диагностических проверок. Используйте вариант, который вы предпочитаете.

Вариант 1. Запуск скрипта

Скрипт PowerShell TeamsLaunchCheck.ps1 автоматизирует все проверки, которые необходимо выполнить.

Скрипт TeamsLaunchCheck.ps1
# $erroractionpreference="stop"

$list = @(
    "$env:APPDATA", 
    "$env:APPDATA\Microsoft", 
    "$env:APPDATA\Microsoft\Crypto", 
    "$env:APPDATA\Microsoft\Internet Explorer", 
    "$env:APPDATA\Microsoft\Internet Explorer\UserData", 
    "$env:APPDATA\Microsoft\Internet Explorer\UserData\Low",
    "$env:APPDATA\Microsoft\Spelling", 
    "$env:APPDATA\Microsoft\SystemCertificates",
    "$env:APPDATA\Microsoft\Windows", 
    "$env:APPDATA\Microsoft\Windows\Libraries",
    "$env:APPDATA\Microsoft\Windows\Recent",
    "$env:LOCALAPPDATA",
    "$env:LOCALAPPDATA\Microsoft",
    "$env:LOCALAPPDATA\Microsoft\Windows",
    "$env:LOCALAPPDATA\Microsoft\Windows\Explorer",
    "$env:LOCALAPPDATA\Microsoft\Windows\History",
    "$env:LOCALAPPDATA\Microsoft\Windows\History\Low",
    "$env:LOCALAPPDATA\Microsoft\Windows\History\Low\History.IE5",
    "$env:LOCALAPPDATA\Microsoft\Windows\IECompatCache",
    "$env:LOCALAPPDATA\Microsoft\Windows\IECompatCache\Low",
    "$env:LOCALAPPDATA\Microsoft\Windows\IECompatUaCache",
    "$env:LOCALAPPDATA\Microsoft\Windows\IECompatUaCache\Low",
    "$env:LOCALAPPDATA\Microsoft\Windows\INetCache",
    "$env:LOCALAPPDATA\Microsoft\Windows\INetCookies",
    "$env:LOCALAPPDATA\Microsoft\Windows\INetCookies\DNTException",
    "$env:LOCALAPPDATA\Microsoft\Windows\INetCookies\DNTException\Low",
    "$env:LOCALAPPDATA\Microsoft\Windows\INetCookies\Low",
    "$env:LOCALAPPDATA\Microsoft\Windows\INetCookies\PrivacIE",
    "$env:LOCALAPPDATA\Microsoft\Windows\INetCookies\PrivacIE\Low",
    "$env:LOCALAPPDATA\Microsoft\Windows\PPBCompatCache",
    "$env:LOCALAPPDATA\Microsoft\Windows\PPBCompatCache\Low",
    "$env:LOCALAPPDATA\Microsoft\Windows\PPBCompatUaCache",
    "$env:LOCALAPPDATA\Microsoft\Windows\PPBCompatUaCache\Low",
    "$env:LOCALAPPDATA\Microsoft\WindowsApps",
    "$env:LOCALAPPDATA\Packages",
    "$env:LOCALAPPDATA\Publishers",
    "$env:LOCALAPPDATA\Publishers\8wekyb3d8bbwe",
    "$env:LOCALAPPDATA\Temp",
    "$env:USERPROFILE\AppData\LocalLow",
    "$env:USERPROFILE\AppData\LocalLow\Microsoft",
    "$env:USERPROFILE\AppData\LocalLow\Microsoft\Internet Explorer",
    "$env:USERPROFILE\AppData\LocalLow\Microsoft\Internet Explorer\DOMStore",
    "$env:USERPROFILE\AppData\LocalLow\Microsoft\Internet Explorer\EdpDomStore",
    "$env:USERPROFILE\AppData\LocalLow\Microsoft\Internet Explorer\EmieSiteList",
    "$env:USERPROFILE\AppData\LocalLow\Microsoft\Internet Explorer\EmieUserList",
    "$env:USERPROFILE\AppData\LocalLow\Microsoft\Internet Explorer\IEFlipAheadCache"
)

$ver = Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\'
$script:osVersion = $ver.DisplayVersion
if($script:osVersion -eq "")    {
        $script:osVersion = $ver.ReleaseId
}
$script:osBuild = (Get-WmiObject -Class Win32_OperatingSystem).Version
$script:osUBR= [int]$ver.UBR
$script:osFullBuild = [version]"$script:osBuild.$script:osUBR"
$script:osProductName = $ver.ProductName

function ValidateShellFolders
{
    $shellFolders = @(
        "Cookies",
        "Cache"
    )

    $shellPaths = @{}

    $path = "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"    
    $keys = Get-Item $path
    $props = Get-ItemProperty $path
    ($keys).Property | %{
        $shellPaths[$_] = $props."$_"
        $str = $props."$_"
        $str += "`t: " + $_
        echo $str
    }

    foreach($shellFolder in $shellFolders)
    {
        $shellPath = $shellPaths[$shellFolder]
        if(PathContainsReparsePoint($shellPath))
        {
            Write-Warning "$($shellFolder) User Shell Folder path $shellPath contains a reparse point."
        }
        else
        {
            Write-Host "$($shellFolder) User Shell Folder path $shellPath is not a reparse point" -ForegroundColor Green
        }
    }
}

function ValidateEnvironmentVars
{
    $temps = (gci env:* | ?{@("TEMP", "TMP").Contains($_.Name)})
    foreach($temp in $temps)
    {
        if(PathContainsReparsePoint($temp.Value))
        {
            Write-Warning "$($temp.Name): $($temp.Value) contains a reparse point."
        }
        else
        {
            Write-Host "$($temp.Name): $($temp.Value) is not a reparse point" -ForegroundColor Green
        }
    }
}

function ValidateUserAccess($list)
{
    $checked = @()
    foreach ($path in $list)
    {
        $left = $path
        for($i=0;$i -lt 10; $i++)
        {
            if ([string]::IsNullOrEmpty($left))
            {
                break;
            }
            if(-Not $checked.Contains($left))
            {
                try
                {
                    if (Test-Path -Path $left)
                    {
                        $items = Get-ChildItem $left -ErrorAction SilentlyContinue -ErrorVariable GCIErrors
                        if($GCIErrors.Count -eq 0)
                        {
                            Write-Host "User is able to access $left" -ForegroundColor Green
                        }
                        else
                        {
                            Write-Warning "$left is missing permissions for the current user."
                        }
                        $checked += $left
                    }
                    else
                    {
                        Write-Host "MISSING: $path" -ForegroundColor Green
                    }
                }
                catch
                {
                    Write-Warning "Error trying to access $left."
                }
            }
            $left=Split-Path $left
        }
    }
}

function ValidatePaths($list)
{
    foreach ($path in $list)
    {
        if (Test-Path -Path $path)
        {
            if (Test-Path -Path $path -PathType Container)
            {
                Write-Host "Folder: $path" -ForegroundColor Green
            }
            else
            {
                Write-Warning "FILE: $path"
            }
        }
        else
        {
            Write-Host "MISSING: $path" -ForegroundColor Green
        }
    }
}

function ValidateSystemPerms($list)
{
    foreach ($path in $list)
    {
        if (Test-Path -Path $path)
        {
            $systemPerms = (Get-Acl $path).Access | where {$_.IdentityReference -eq "NT AUTHORITY\SYSTEM"}
            $systemFullControl = $systemPerms | where {$_.FileSystemRights -eq "FullControl" -and $_.AccessControlType -eq "Allow"}
            if($systemFullControl.Count -ge 1)
            {
                Write-Host "$path has the correct permissions assigned for SYSTEM account" -ForegroundColor Green
            }
            else
            {
                Write-Warning "$path is missing permissions for the SYSTEM account. The current permissions:"
                $systemPerms
            }
            $adminPerms = (Get-Acl $path).Access | where {$_.IdentityReference -eq "BUILTIN\Administrators"}
            $adminFullControl = $adminPerms | where {$_.FileSystemRights -eq "FullControl" -and $_.AccessControlType -eq "Allow"}
            if($adminFullControl.Count -ge 1)
            {
                Write-Host "$path has the correct permissions assigned for Administrators group" -ForegroundColor Green
            }
            else
            {
                Write-Warning "$path is missing permissions for the Administrators group. The current permissions:"
                $adminPerms
            }
        }
        else
        {
            Write-Host "MISSING: $path" -ForegroundColor Green
        }
    }
}

function ValidateSysAppIdPerms
{
    $apps = Get-AppxPackage MSTeams 
    foreach($app in $apps)
    {
        $perms = (Get-Acl $app.InstallLocation).sddl -split "\(" | ?{$_ -match "WIN:/\/\SYSAPPID"}
        if($perms.Length -gt 0)
        {
            Write-Host "$($app.InstallLocation) has the correct SYSAPPID permissions assigned" -ForegroundColor Green
        }
        else
        {
            Write-Warning "$($app.InstallLocation) is missing SYSAPPID permissions."
        }
    }
}

function IsReparsePoint([string]$path) 
{

    $props = Get-ItemProperty -Path $path -ErrorAction SilentlyContinue
    if($props.Attributes -match 'ReparsePoint')
    {
        return $true
    }
    return $false
}

function PathContainsReparsePoint($path, $trace = $false)
{
    $badPaths = 0
    $result = ""
    $left = $path
    for($i=0;$i -lt 10; $i++)
    {
        if ([string]::IsNullOrEmpty($left))
        {
            break;
        };
        if(IsReparsePoint($left))
        {
            $result = "Y" + $result
            $badPaths++
        }
        else{
            $result = "N" + $result
        }
        $left=Split-Path $left
    }
    if($trace)
    {
        if ($result.Contains("Y"))
        {
            Write-Warning "$result $path contains a reparse point"
        }
        else
        {
            Write-Host "$result $path" -ForegroundColor Green
        }
    }
    return $badPaths -gt 0
}

function ValidateAppXPolicies()
{
    $osPatchThresholds = @{
        "10.0.19044" = 4046 #Win 10 21H2
        "10.0.19045" = 3636 #Win 10 22H2
        "10.0.22000" = 2777 #Win 11 21H2
        "10.0.22621" = 2506 #Win 11 22H2
    }

    $minPatchVersion = [version]"10.0.19044"
    $maxPatchVersion = [version]"10.0.22621"

    if($script:osFullBuild -lt $minPatchVersion)
    {
        if(-Not (HasAllowAllTrustedAppsKeyEnabled))
        {
            Write-Warning "AllowAllTrustedApps is not enabled and OS version is too low to get the AllowAllTrustedApps patch."
        }
        else
        {
            Write-Host "The OS version is too low to get the AllowAllTrustedApps patch, but AllowAllTrustedApps is a supported value" -ForegroundColor Green
        }
    }
    elseif($script:osFullBuild -le $maxPatchVersion)
    {
        $targetUBR = $osPatchThresholds[$script:osBuild]
        if($script:osUBR -lt $targetUBR)
        {
            if(-Not (HasAllowAllTrustedAppsKeyEnabled))
            {
                $recommendedVersion = [version]"$script:osBuild.$targetUBR"
                Write-Warning "AllowAllTrustedApps is not enabled and your version of Windows does not contain a required patch to support this.`nEither update your version of Windows to be greater than $recommendedVersion, or enable AllowAllTrustedApps"
            }
            else
            {
                Write-Host "OS version is missing the AllowAllTrustedApps patch, but AllowAllTrustedApps is a supported value" -ForegroundColor Green
            }
        }
        else
        {
            Write-Host "OS version has the AllowAllTrustedApps patch" -ForegroundColor Green
        }
    }
    else
    {
        Write-Host "OS version is high enough that AllowAllTrustedApps should not be an issue" -ForegroundColor Green
    }
}

function HasAllowAllTrustedAppsKeyEnabled
{
    $hasKey = $false;
    $appXKeys = @("HKLM:\Software\Microsoft\Windows\CurrentVersion\AppModelUnlock", "HKLM:\Software\Policies\Microsoft\Windows\Appx")
    foreach ($key in $appXKeys)
    {
        try
        {
            $value = Get-ItemPropertyValue -Path $key -Name "AllowAllTrustedApps"
            echo "$key AllowAllTrustedApps = $value"
            if ($value -ne 0) 
            {
                $hasKey = $true
                break;
            }
        }
        catch
        {
            echo "Missing AllowAllTrustedApps key at $key"
        }
    }
    return $hasKey
}

echo "$script:osProductName Version $script:osVersion, Build $script:osFullBuild"
echo ""
echo "# Checking for reparse points in user shell folders"
ValidateShellFolders
echo ""
echo "# Checking for reparse points in temp/tmp environment variables"
ValidateEnvironmentVars
echo ""
echo "# Checking for user permissions in appdata"
ValidateUserAccess($list)
echo ""
echo "# Checking for reparse points in appdata"
foreach ($path in $list)
{
    $result = PathContainsReparsePoint $path $true
}
echo ""
echo "# Checking for unexpected files in appdata"
ValidatePaths($list)
echo ""
echo "# Checking SYSTEM and Administrators permissions in appdata"
ValidateSystemPerms($list)
echo ""
echo "# Checking SYSAPPID permissions"
ValidateSysAppIdPerms
echo ""
echo "# Checking if AllowAllTrustedApps is valid"
ValidateAppXPolicies

Pause

Вариант 2. Выполнение проверок вручную

Важно!

В этот раздел, описание метода или задачи включены действия, содержащие указания по изменению параметров реестра. Однако неправильное изменение параметров реестра может привести к возникновению серьезных проблем. Поэтому убедитесь, что вы внимательно выполните следующие действия. Для дополнительной защиты создайте резервную копию реестра перед его изменением. В этом случае реестр можно восстановить, если возникнет проблема.

  1. Проверьте, указывают ли папки файлов cookie и оболочки кэша на расположение, которое является точкой повторного использования:

    1. Выполните следующие команды PowerShell:

      (gp ([environment]::getfolderpath("Cookies"))).Attributes -match 'ReparsePoint'
      (gp ([environment]::getfolderpath("InternetCache"))).Attributes -match 'ReparsePoint'
      
    2. Если обе команды возвращают false, перейдите к шагу 2. В противном случае откройте редактор реестра и найдите следующий подраздел:

      Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders

    3. Для папки оболочки в команде PowerShell, возвращаемой как true, обновите значение связанной записи реестра в расположение, которое не является точкой повторного определения. Например, можно задать для значения путь по умолчанию:

    Параметр реестра Значение
    Файлы cookie %USERPROFILE%\AppData\Local\Microsoft\Windows\INetCookies
    Cache %USERPROFILE%\AppData\Local\Microsoft\Windows\INetCache
  2. Проверьте, заданы ли значения переменных среды TEMP или TMP в точке повторного использования:

    1. Выполните следующую команду PowerShell:

      gci env:* | ?{@("TEMP", "TMP").Contains($_.Name)} | %{$_.Value+" - "+((gp $_.Value).Attributes -match 'ReparsePoint')}
      
    2. Если команда возвращает false, перейдите к шагу 3. В противном случае задайте для переменных среды значение расположения, которое не является точкой повторного использования.

  3. Проверьте, есть ли у вас разрешение на чтение для доступа ко всем следующим каталогам в папке AppData :

    • %USERPROFILE%\AppData\Local
    • %USERPROFILE%\AppData\Local\Microsoft
    • %USERPROFILE%\AppData\Local\Microsoft\Windows
    • %USERPROFILE%\AppData\Local\Microsoft\Windows\Explorer
    • %USERPROFILE%\AppData\Local\Microsoft\Windows\History
    • %USERPROFILE%\AppData\Local\Microsoft\Windows\History\Low
    • %USERPROFILE%\AppData\Local\Microsoft\Windows\History\Low\History.IE5
    • %USERPROFILE%\AppData\Local\Microsoft\Windows\IECompatCache
    • %USERPROFILE%\AppData\Local\Microsoft\Windows\IECompatCache\Low
    • %USERPROFILE%\AppData\Local\Microsoft\Windows\IECompatUaCache
    • %USERPROFILE%\AppData\Local\Microsoft\Windows\IECompatUaCache\Low
    • %USERPROFILE%\AppData\Local\Microsoft\Windows\INetCache
    • %USERPROFILE%\AppData\Local\Microsoft\Windows\INetCookies
    • %USERPROFILE%\AppData\Local\Microsoft\Windows\INetCookies\DNTException
    • %USERPROFILE%\AppData\Local\Microsoft\Windows\INetCookies\DNTException\Low
    • %USERPROFILE%\AppData\Local\Microsoft\Windows\INetCookies\Low
    • %USERPROFILE%\AppData\Local\Microsoft\Windows\INetCookies\PrivacIE
    • %USERPROFILE%\AppData\Local\Microsoft\Windows\INetCookies\PrivacIE\Low
    • %USERPROFILE%\AppData\Local\Microsoft\Windows\PPBCompatCache
    • %USERPROFILE%\AppData\Local\Microsoft\Windows\PPBCompatCache\Low
    • %USERPROFILE%\AppData\Local\Microsoft\Windows\PPBCompatUaCache
    • %USERPROFILE%\AppData\Local\Microsoft\Windows\PPBCompatUaCache\Low
    • %USERPROFILE%\AppData\Local\Microsoft\WindowsApps
    • %USERPROFILE%\AppData\Local\Packages
    • %USERPROFILE%\AppData\Local\Packages\VirtualizationTests.Main_8wekyb3d8bbwe\LocalCache
    • %USERPROFILE%\AppData\Local\Publishers
    • %USERPROFILE%\AppData\Local\Publishers\8wekyb3d8bbwe
    • %USERPROFILE%\AppData\Local\Temp
    • %USERPROFILE%\AppData\LocalLow
    • %USERPROFILE%\AppData\LocalLow\Microsoft
    • %USERPROFILE%\AppData\LocalLow\Microsoft\Internet Explorer
    • %USERPROFILE%\AppData\LocalLow\Microsoft\Internet Explorer\DOMStore
    • %USERPROFILE%\AppData\LocalLow\Microsoft\Internet Explorer\EdpDomStore
    • %USERPROFILE%\AppData\LocalLow\Microsoft\Internet Explorer\EmieSiteList
    • %USERPROFILE%\AppData\LocalLow\Microsoft\Internet Explorer\EmieUserList
    • %USERPROFILE%\AppData\LocalLow\Microsoft\Internet Explorer\IEFlipAheadCache
    • %USERPROFILE%\AppData\Roaming
    • %USERPROFILE%\AppData\Roaming\Microsoft
    • %USERPROFILE%\AppData\Roaming\Microsoft\Crypto
    • %USERPROFILE%\AppData\Roaming\Microsoft\Internet Explorer
    • %USERPROFILE%\AppData\Roaming\Microsoft\Internet Explorer\UserData
    • %USERPROFILE%\AppData\Roaming\Microsoft\Internet Explorer\UserData\Low
    • %USERPROFILE%\AppData\Roaming\Microsoft\Spelling
    • %USERPROFILE%\AppData\Roaming\Microsoft\SystemCertificates
    • %USERPROFILE%\AppData\Roaming\Microsoft\Windows
    • %USERPROFILE%\AppData\Roaming\Microsoft\Windows\Libraries
    • %USERPROFILE%\AppData\Roaming\Microsoft\Windows\Recent

    Для выполнения этой проверки можно использовать команду Test-Path PowerShell. Если у вас нет разрешения на чтение для определенной папки, попросите пользователя, у которого есть разрешение на полное управление для папки, чтобы предоставить вам разрешение на чтение.

  4. Проверьте, изменяются ли какие-либо папки, перечисленные на шаге 3, в качестве точек повторного анализа. Если какая-либо из папок является точками повторного анализа, обратитесь к служба поддержки Майкрософт.

  5. Проверьте наличие файлов, имеющих то же имя, что и требуемая системная папка в папке AppData . Например, файл, который называется библиотеками в пути , %AppData%\Microsoft\Windows\Libraries, имеет то же имя, что и папка с тем же путем. Для каждой папки, указанной на шаге 3, выполните следующую команду PowerShell:

    Test-Path -Path <directory name, such as $env:USERPROFILE\AppData\Local\Temp>  -PathType Leaf
    

    Если команда возвращает значение True, удалите файл и создайте папку, используя то же имя, что и полный путь к системной папке.

  6. Проверьте, имеет ли учетная запись SYSTEM и группу администраторов разрешение на полный контроль для всех каталогов, перечисленных на шаге 3.

    1. Выполните следующие команды PowerShell для каждой папки:

      ((Get-Acl (Join-Path $env:USERPROFILE "<directory name that starts with AppData, such as AppData\Local>")).Access | ?{$_.IdentityReference -eq "NT AUTHORITY\SYSTEM" -and $_.FileSystemRights -eq "FullControl"} | measure).Count -eq 1
      ((Get-Acl (Join-Path $env:USERPROFILE "<directory name that starts with AppData, such as AppData\Local>")).Access | ?{$_.IdentityReference -eq "BUILTIN\Administrators" -and $_.FileSystemRights -eq "FullControl"} | measure).Count -eq 1
      
    2. Если любая из команд возвращает значение False, попросите пользователя, у которого есть разрешение "Полный доступ" для папки, чтобы предоставить разрешение "Полный доступ" соответствующей учетной записи.

  7. Проверьте, есть ли у вас разрешение SYSAPPID на расположение установки Teams. Выполните следующую команду PowerShell:

    Get-AppxPackage MSTeams | %{$_.InstallLocation+" - "+(((Get-Acl $_.InstallLocation).sddl -split "\(" | ?{$_ -match "WIN:/\/\SYSAPPID"} | Measure).count -eq 1)}
    

    Если команда возвращает false, попросите члена локальной группы администраторов удалить профиль пользователя на компьютере. Затем войдите с помощью учетной записи пользователя для повторного создания профиля пользователя.

  8. Проверьте параметр политики AllowAllTrustedApps:

    1. В окне командной строки выполните winver команду.

    2. Сравните версию Windows и номер сборки в результатах со следующими версиями Windows 11 и Windows 10:

      • Ос Windows 11 версии 21H2 сборка 22000.2777
      • Ос Windows 11 версии 22H2 сборка 22621.2506
      • Ос Windows 10 версии 21H2 сборка 19044.4046
      • Ос Windows 10 версии 22H2, сборка 19045.3636
    3. Если версия Windows и номер сборки выше, чем в списке, откройте редактор реестра и найдите запись реестра AllowAllTrustedApps в одном из следующих подразделов:

      • Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock
      • Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Appx
    4. Проверьте значение AllowAllTrustedApps. Если значение равно 0, политика отключена. Измените его на 1 , чтобы включить политику, а затем повторите попытку, чтобы запустить новые Teams.

      Примечание. Чтобы запустить новые Teams без включения политики AllowAllTrustedApps , необходимо запустить одну из версий Windows, перечисленных на шаге 5b.

  9. Если проблема сохранится, обновите систему до Windows 11 версии 22H2, сборка ОС 22621.2506 или более поздняя версия.