엔터프라이즈 앱 관리

이 문서에서는 Windows 10 주요 MDM(모바일 디바이스 관리) 기능 중 하나를 다룹니다. 모든 Windows에서 앱의 수명 주기를 관리합니다. 기본 MDM 기능의 일부로 Store 및 비 Store 앱을 모두 관리하는 기능입니다. Windows 10 새로운 기능은 모든 앱의 인벤토리를 사용할 수 있는 기능입니다.

애플리케이션 관리 목표

Windows 10 관리 서버에서 다음을 수행할 수 있는 기능을 제공합니다.

  • 비즈니스용 Microsoft Store 직접 앱 설치
  • 오프라인 스토어 앱 및 라이선스 배포
  • LOB(기간 업무) 앱 배포(비 스토어 앱)
  • 사용자의 모든 앱 인벤토리(스토어 및 비 스토어 앱)
  • 디바이스의 모든 앱 인벤토리(스토어 및 비 스토어 앱)
  • 사용자에 대한 모든 앱 제거(스토어 및 비 스토어 앱)
  • 데스크톱 버전용 Windows 10 실행하는 디바이스의 모든 사용자(Home, Pro, Enterprise 및 Education)에 대해 설치되도록 앱을 프로비전합니다.
  • 데스크톱 버전에 대한 Windows 10 실행하는 디바이스에서 프로비전된 앱 제거

앱 인벤토리

Windows 10 통해 사용자에게 배포된 모든 앱을 인벤토리화하고 데스크톱 버전의 Windows 10 디바이스의 모든 사용자에 대한 모든 앱을 인벤토리할 수 있습니다. EnterpriseModernAppManagement CSP(구성 서비스 공급자) 인벤토리는 패키지된 앱을 포함하고 MSI 또는 실행 파일을 통해 설치된 기존 Win32 앱을 포함하지 않습니다. 앱이 인벤토리에 추가되면 다음 앱 분류에 따라 구분됩니다.

  • 스토어 - Microsoft Store의 앱입니다. 스토어에서 직접 앱을 설치하거나 비즈니스용 스토어에서 엔터프라이즈와 함께 배달할 수 있습니다.
  • nonStore - Microsoft Store에서 가져오지 않은 앱입니다.
  • 시스템 - OS의 일부인 앱입니다. 이러한 앱은 제거할 수 없습니다. 이 분류는 읽기 전용이며 인벤토리에만 사용할 수 있습니다.

이러한 분류는 EnterpriseModernAppManagement CSP에서 노드로 표시됩니다.

다음 정보는 트리 형식의 EnterpriseModernAppManagement CSP를 보여 줍니다.

./Device/Vendor/MSFT
or
./User/Vendor/MSFT
EnterpriseAppManagement
----AppManagement
--------UpdateScan
--------LastScanError
--------AppInventoryResults
--------AppInventoryQuery
--------RemovePackage
--------AppStore
----------PackageFamilyName
------------PackageFullName
--------------Name
--------------Version
--------------Publisher
--------------Architecture
--------------InstallLocation
--------------IsFramework
--------------IsBundle
--------------InstallDate
--------------ResourceID
--------------RequiresReinstall
--------------PackageStatus
--------------Users
--------------IsProvisioned
--------------IsStub
------------DoNotUpdate
------------AppSettingPolicy
--------------SettingValue
------------MaintainProcessorArchitectureOnUpdate
------------NonRemovable
----------ReleaseManagement
------------ReleaseManagementKey
--------------ChannelId
--------------ReleaseId
--------------EffectiveRelease
-----------------ChannelId
-----------------ReleaseId
--------nonStore
----------PackageFamilyName
------------PackageFullName
--------------Name
--------------Version
--------------Publisher
--------------Architecture
--------------InstallLocation
--------------IsFramework
--------------IsBundle
--------------InstallDate
--------------ResourceID
--------------RequiresReinstall
--------------PackageStatus
--------------Users
--------------IsProvisioned
--------------IsStub
------------DoNotUpdate
------------AppSettingPolicy
--------------SettingValue
------------MaintainProcessorArchitectureOnUpdate
------------NonRemoveable
--------System
----------PackageFamilyName
------------PackageFullName
--------------Name
--------------Version
--------------Publisher
--------------Architecture
--------------InstallLocation
--------------IsFramework
--------------IsBundle
--------------InstallDate
--------------ResourceID
--------------RequiresReinstall
--------------PackageStatus
--------------Users
--------------IsProvisioned
--------------IsStub
------------DoNotUpdate
------------AppSettingPolicy
--------------SettingValue
------------MaintainProcessorArchitectureOnUpdate
------------NonRemoveable
----AppInstallation
--------PackageFamilyName
----------StoreInstall
----------HostedInstall
----------LastError
----------LastErrorDesc
----------Status
----------ProgressStatus
----AppLicenses
--------StoreLicenses
----------LicenseID
------------LicenseCategory
------------LicenseUsage
------------RequesterID
------------AddLicense
------------GetLicenseFromStore

각 앱은 설치된 앱에 대해 하나의 패키지 패밀리 이름과 1-n개의 패키지 전체 이름을 표시합니다. 앱은 원본(스토어, 비스토어, 시스템)에 따라 분류됩니다.

인벤토리는 AppManagement 노드에서 패키지 전체 이름을 통해 모든 수준에서 재귀적으로 실행할 수 있습니다. 인벤토리는 특정 인벤토리 특성에 대해서만 실행할 수도 있습니다.

인벤토리는 패키지 전체 이름과 패키지 패밀리 이름에 해당하는 번들 팩 및 리소스 팩을 나열합니다.

각 패키지 전체 이름에 대한 노드는 다음과 같습니다.

  • 이름
  • 버전
  • 게시자
  • Architecture
  • InstallLocation
  • IsFramework
  • IsBundle
  • InstallDate
  • Resourceid
  • RequiresReinstall
  • PackageStatus
  • 사용자
  • IsProvisioned

각 노드에 대한 자세한 설명은 EnterpriseModernAppManagement CSP를 참조하세요.

앱 인벤토리

EnterpriseModernAppManagement CSP를 사용하여 사용자 또는 디바이스에 대해 설치된 모든 앱을 쿼리할 수 있습니다. 쿼리는 MDM 또는 다른 메서드를 사용하여 설치된 경우에도 모든 앱을 반환합니다. 인벤토리는 사용자 또는 디바이스 수준에서 실행할 수 있습니다. 디바이스 수준의 인벤토리는 디바이스의 모든 사용자에 대한 정보를 반환합니다.

디바이스의 전체 인벤토리를 수행하는 것은 설치된 하드웨어 및 앱 수에 따라 리소스를 많이 사용할 수 있습니다. 반환된 데이터도 클 수 있습니다. 이러한 요청을 청크하여 클라이언트 및 네트워크 트래픽에 미치는 영향을 줄일 수 있습니다.

디바이스의 모든 앱에 대한 쿼리의 예는 다음과 같습니다.

<!-- Get all apps under AppManagement -->
<Get>
   <CmdID>1</CmdID>
   <Item>
      <Target>
         <LocURI>./Device/Vendor/MSFT/EnterpriseModernAppManagement/AppManagement?list=StructData</LocURI>
      </Target>
   </Item>
</Get>

다음은 사용자에 대한 특정 앱에 대한 쿼리의 예입니다.

<!-- Get all information of a specific app for a user -->
<Get>
   <CmdID>1</CmdID>
   <Item>
      <Target>
         <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppManagement/AppStore/{PackageFamilyName}?list=StructData</LocURI>
      </Target>
   </Item>
</Get>

스토어 라이선스 인벤토리

EnterpriseModernAppManagement CSP를 사용하여 사용자 또는 디바이스에 대해 설치된 모든 앱 라이선스를 쿼리할 수 있습니다. 쿼리는 MDM 또는 다른 메서드를 통해 설치된 경우 이벤트인 모든 앱 라이선스를 반환합니다. 인벤토리는 사용자 또는 디바이스 수준에서 실행할 수 있습니다. 디바이스 수준의 인벤토리는 디바이스의 모든 사용자에 대한 정보를 반환합니다.

각 라이선스 ID에 대한 노드는 다음과 같습니다.

  • LicenseCategory
  • LicenseUsage
  • RequestedID

각 노드에 대한 자세한 설명은 EnterpriseModernAppManagement CSP를 참조하세요.

참고

CSP의 LicenseID는 라이선스의 콘텐츠 ID입니다.

디바이스의 모든 앱 라이선스에 대한 쿼리의 예는 다음과 같습니다.

<!-- Get all app licenses for the device -->
<Get>
   <CmdID>1</CmdID>
   <Item>
      <Target>
         <LocURI>./Device/Vendor/MSFT/EnterpriseModernAppManagement/AppLicenses/StoreLicenses?list=StructData</LocURI>
      </Target>
   </Item>
</Get>

다음은 사용자에 대한 모든 앱 라이선스에 대한 쿼리의 예입니다.

<!-- Get a specific app license for a user -->
<Get>
   <CmdID>1</CmdID>
   <Item>
      <Target>
         <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppLicenses/StoreLicenses/{license id}?list=StructData</LocURI>
      </Target>
   </Item>
</Get>

디바이스에서 비 스토어 앱을 설치하도록 설정

배포할 수 있는 두 가지 기본 유형의 앱은 스토어 앱과 엔터프라이즈 서명된 앱입니다. 엔터프라이즈 서명된 앱을 배포하려면 신뢰할 수 있는 앱을 허용하도록 디바이스에서 설정을 사용하도록 설정해야 합니다. 앱은 Microsoft 승인된 루트(예: Symantec), 엔터프라이즈 배포 루트 또는 자체 서명된 앱으로 서명할 수 있습니다. 이 섹션에서는 비 스토어 앱 배포를 위해 디바이스를 구성하는 단계를 설명합니다.

비 스토어 앱에 대한 디바이스 잠금 해제

Microsoft Store에 없는 앱을 배포하려면 ApplicationManagement/AllowAllTrustedApps 정책을 구성해야 합니다. 이 정책을 사용하면 디바이스에 인증서 체인이 있는 경우 디바이스에 비 스토어 앱을 설치할 수 있습니다. 앱은 디바이스의 루트 인증서(예: Symantec Enterprise), 엔터프라이즈 소유 루트 인증서 또는 디바이스에 배포된 피어 트러스트 인증서로 서명할 수 있습니다. 사용자 라이선스 배포에 대한 자세한 내용은 사용자에게 오프라인 라이선스 배포를 참조하세요.

AllowAllTrustedApps 정책을 사용하면 디바이스의 신뢰할 수 있는 사람 인증서 또는 디바이스의 신뢰할 수 있는 루트에 있는 루트 인증서로 신뢰할 수 있는 앱을 설치할 수 있습니다. 정책은 기본적으로 구성되지 않으므로 Microsoft Store의 앱만 설치할 수 있습니다. 관리 서버가 암시적으로 값을 해제로 설정하면 디바이스의 설정 패널에서 설정이 비활성화됩니다.

AllowAllTrustedApps 정책에 대한 자세한 내용은 정책 CSP를 참조하세요.

예를 들면 다음과 같습니다.

<!-- Get policy (Default)-->
<Get>
  <CmdID>1</CmdID>
  <Item>
    <Target>
      <LocURI>./Vendor/MSFT/Policy/Result/ApplicationManagement/AllowAllTrustedApps?list=StructData</LocURI>
    </Target>
    </Item>
</Get>
<!-- Update policy -->
<Replace>
  <CmdID>2</CmdID>
  <Item>
    <Target>
      <LocURI>./Vendor/MSFT/Policy/Config/ApplicationManagement/AllowAllTrustedApps</LocURI>
    </Target>
    <Meta>
      <Format>int</Format>
      <Type>text/plain</Type>
    </Meta>
    <Data>1</Data>
  </Item>
</Replace>

개발자 모드용 디바이스 잠금 해제

Windows 10 앱을 개발하려면 더 이상 특별한 라이선스가 필요하지 않습니다. 정책 CSP에서 ApplicationManagement/AllowDeveloperUnlock 정책을 사용하여 패키지되지 않은 앱의 디버깅 및 배포를 사용하도록 설정할 수 있습니다.

AllowDeveloperUnlock 정책은 디바이스에서 개발 모드를 사용하도록 설정합니다. AllowDeveloperUnlock은 기본적으로 구성되지 않으므로 Microsoft 스토어 앱만 설치할 수 있습니다. 관리 서버가 명시적으로 값을 해제로 설정하면 디바이스의 설정 패널에서 설정이 비활성화됩니다.

데스크톱 버전용으로 Windows 10 앱을 배포하려면 디바이스에 인증서 체인이 있어야 합니다. 앱은 디바이스의 루트 인증서(예: Symantec Enterprise), 엔터프라이즈 소유 루트 인증서 또는 디바이스에 배포된 피어 트러스트 인증서로 서명할 수 있습니다.

AllowDeveloperUnlock 정책에 대한 자세한 내용은 정책 CSP를 참조하세요.

예를 들면 다음과 같습니다.

<!-- Get policy (Default)-->
<Get>
  <CmdID>1</CmdID>
  <Item>
    <Target>
      <LocURI>./Vendor/MSFT/Policy/Result/ApplicationManagement/AllowDeveloperUnlock?list=StructData</LocURI>
    </Target>
  </Item>
</Get>
<!-- Update policy -->
<Replace>
  <CmdID>2</CmdID>
  <Item>
    <Target>
      <LocURI>./Vendor/MSFT/Policy/Config/ApplicationManagement/AllowDeveloperUnlock</LocURI>
    </Target>
    <Meta>
      <Format>int</Format>
      <Type>text/plain</Type>
    </Meta>
    <Data>1</Data>
  </Item>
</Replace>

앱 설치

특정 사용자 또는 디바이스의 모든 사용자에게 앱을 설치할 수 있습니다. 앱은 Microsoft 스토어에서 직접 설치됩니다. 또는 로컬 디스크, UNC 경로 또는 HTTPS 위치와 같은 호스트 위치에서 설치됩니다. EnterpriseModernAppManagement CSP의 AppInstallation 노드를 사용하여 앱을 설치합니다.

스토어에서 사용자에게 앱 배포

Microsoft Store에서 사용자에게 직접 앱을 배포하기 위해 관리 서버는 EnterpriseModernAppManagement CSP의 AppInstallation 노드에서 추가 및 Exec 명령을 실행합니다. 이 기능은 사용자 컨텍스트에서만 지원되며 디바이스 컨텍스트에서는 지원되지 않습니다.

비즈니스용 스토어에서 앱을 구입했고 앱이 온라인 라이선스에 대해 지정된 경우 앱과 라이선스는 Microsoft Store에서 직접 획득해야 합니다.

이 시나리오에 대한 요구 사항은 다음과 같습니다.

  • 앱은 비즈니스용 스토어의 사용자 Azure Active Directory(Azure AD) ID에 할당됩니다. 비즈니스용 스토어 또는 관리 서버를 통해 직접 할당할 수 있습니다.
  • 디바이스는 Microsoft Store에 연결해야 합니다.
  • Microsoft 스토어 서비스를 디바이스에서 사용하도록 설정해야 합니다. 엔터프라이즈 관리자가 Microsoft Store에 대한 UI를 사용하지 않도록 설정할 수 있습니다.
  • 사용자는 Azure AD ID로 로그인해야 합니다.

예를 들면 다음과 같습니다.

<Exec>
   <CmdID>1</CmdID>
          <Item>
            <Target>
              <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppInstallation/{PackageFamilyName}/StoreInstall</LocURI>
            </Target>
            <Meta>
                <Format xmlns="syncml:metinf">xml</Format>
            </Meta>
            <Data><Application id="{ProductID}" flags="0" skuid=" "/></Data>
          </Item>
</Exec>

이전 릴리스의 변경 내용은 다음과 같습니다.

  1. "{CatID}" 참조를 "{ProductID}"로 업데이트해야 합니다. 이 값은 비즈니스용 스토어 관리 도구의 일부로 획득됩니다.

  2. 플래그 값은 "0" 또는 "1"일 수 있습니다.

    "0"을 사용하는 경우 관리 도구는 비즈니스용 스토어 동기화로 다시 호출하여 사용자에게 애플리케이션의 좌석을 할당합니다. "1"을 사용하는 경우 관리 도구는 비즈니스용 스토어 동기화로 다시 호출하여 사용자에게 애플리케이션의 좌석을 할당하지 않습니다. CSP는 좌석을 사용할 수 있는 경우 좌석을 청구합니다.

  3. skuid 필요한 새 매개 변수입니다. 이 값은 비즈니스용 스토어에서 관리 도구 동기화의 일부로 획득됩니다.

사용자에게 오프라인 라이선스 배포

비즈니스용 스토어에서 앱을 구매한 경우 앱 라이선스를 디바이스에 배포해야 합니다.

앱 라이선스는 앱 초기 설치의 일부로만 배포해야 합니다. 업데이트하는 동안 앱만 사용자에게 배포됩니다.

SyncML에서 Exec 명령에서 다음 정보를 지정해야 합니다.

  • 라이선스 ID - 이 ID는 LocURI에 지정됩니다. 오프라인 라이선스의 라이선스 ID를 라이선스 파일의 "콘텐츠 ID"라고 합니다. 비즈니스용 스토어에서 Base64로 인코딩된 라이선스 다운로드에서 이 정보를 검색할 수 있습니다.
  • 라이선스 콘텐츠 - 이 콘텐츠는 데이터 섹션에 지정됩니다. 라이선스 콘텐츠는 라이선스의 Base64로 인코딩된 Blob입니다.

오프라인 라이선스 설치의 예는 다음과 같습니다.

<Exec>
   <CmdID>1</CmdID>
   <Item>
      <Target>
         <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppLicenses/StoreLicenses/{LicenseID}/AddLicense</LocURI>
      </Target>
      <Meta>
         <Format xmlns="syncml:metinf">xml</Format>
      </Meta>
      <Data><License Content="{LicenseBlob}"></Data>
   </Item>
</Exec>

호스트된 위치에서 사용자에게 앱 배포

비즈니스용 스토어에서 앱을 구입했고 앱이 오프라인 라이선스에 대해 지정되었거나 앱이 스토어가 아닌 앱인 경우 호스트된 위치에서 앱을 배포해야 합니다.

이 시나리오에 대한 요구 사항은 다음과 같습니다.

  • 앱의 위치는 로컬 파일 시스템(C:\StagedApps\app1.appx), UNC 경로(\\server\share\app1.apx) 또는 HTTPS 위치(https://contoso.com/app1.appx)일 수 있습니다.
  • 사용자에게 콘텐츠 위치에 액세스할 수 있는 권한이 있어야 합니다. HTTP의 경우 등록과 연결된 인증서를 사용하여 서버 인증 또는 인증서 인증을 사용할 수 있습니다. HTTP 위치는 지원되지만 인증 요구 사항이 부족하여 권장되지 않습니다.
  • 디바이스는 Microsoft 스토어에 연결하거나, 서비스를 저장하거나, Microsoft Store UI를 사용하도록 설정할 필요가 없습니다.
  • 사용자가 로그인해야 하지만 Azure AD ID와의 연결은 필요하지 않습니다.

참고

비스토어 앱을 배포하려면 디바이스의 잠금을 해제하거나 오프라인 앱을 배포하기 전에 앱 라이선스를 배포해야 합니다. 자세한 내용은 사용자에게 오프라인 라이선스 배포를 참조하세요.

등록 취소 시 앱을 적절하게 제거하려면 패키지 패밀리 이름에 대한 Add 명령이 필요합니다.

다음은 기간 업무 앱 설치의 예입니다.

<!-- Add PackageFamilyName -->
<Add>
   <CmdID>0</CmdID>
   <Item>
      <Target>
         <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppInstallation/{PackageFamilyName}</LocURI>
      </Target>
   </Item>
</Add>
<!-- Install appx -->
<Exec>
   <CmdID>1</CmdID>
   <Item>
      <Target>
         <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppInstallation/{PackageFamilyName}/HostedInstall</LocURI>
      </Target>
      <Meta>
         <Format xmlns="syncml:metinf">xml</Format>
      </Meta>
      <Data><Application PackageUri="\\server\share\HelloWorld10.appx" /></Data>
   </Item>
</Exec>

다음은 종속성이 있는 앱 설치의 예입니다.

<!-- Add PackageFamilyName -->
<Add>
   <CmdID>0</CmdID>
   <Item>
      <Target>
         <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppInstallation/{PackageFamilyName</LocURI>
      </Target>
   </Item>
</Add>
<!-- Install appx with deployment options and framework dependencies-->
<Exec>
   <CmdID>1</CmdID>
   <Item>
      <Target>
         <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppInstallation/{PackageFamilyName}/HostedInstall</LocURI>
      </Target>
      <Meta>
         <Format xmlns="syncml:metinf">xml</Format>
      </Meta>
      <Data>
         <Application PackageUri="\\server\share\HelloWorld10.appx" DeploymentOptions="0" >
            <Dependencies>
                      <Dependency PackageUri=”\\server\share\HelloWorldFramework.appx” />
                <Dependency PackageUri=”\\server2\share\HelloMarsFramework.appx” />
            </Dependencies>
        </Application>
      </Data>
   </Item>
</Exec>

다음은 종속성 및 선택적 패키지가 있는 앱 설치의 예입니다.

<!-- Add PackageFamilyName -->
<Add>
   <CmdID>0</CmdID>
   <Item>
      <Target>
         <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppInstallation/{PackageFamilyName</LocURI>
      </Target>
   </Item>
</Add>
<!-- Install appx with deployment options and framework dependencies-->
<Exec>
   <CmdID>1</CmdID>
   <Item>
      <Target>
         <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppInstallation/{PackageFamilyName}/HostedInstall</LocURI>
      </Target>
      <Meta>
         <Format xmlns="syncml:metinf">xml</Format>
      </Meta>
      <Data>
         <Application PackageUri="\\server\share\HelloWorld10.appx" DeploymentOptions="0" >
            <Dependencies>
                <Dependency PackageUri=”\\server\share\HelloWorldFramework.appx” />
                <Dependency PackageUri=”\\server2\share\HelloMarsFramework.appx” />
            </Dependencies>
            <OptionalPackages>
                <Package PackageUri=”\\server\share\OptionalPackage1.appx”
                         PackageFamilyName="/{PackageFamilyName}" />
                <Package PackageUri=”\\server2\share\OptionalPackage2.appx”
                         PackageFamilyName="/{PackageFamilyName}" />
            </OptionalPackages>
        </Application>
      </Data>
   </Item>
</Exec>

디바이스의 모든 사용자에 대한 앱 프로비전

프로비저닝을 사용하면 디바이스에 앱을 스테이징할 수 있으며 디바이스의 모든 사용자는 다음 로그인에 앱을 등록할 수 있습니다. 이 기능은 비즈니스용 스토어에서 구매한 앱에 대해서만 지원되며, 앱은 오프라인 라이선스에 대해 지정되거나 앱은 비 스토어 앱입니다. 호스트된 위치에서 앱을 제공해야 합니다. 앱이 로컬 시스템으로 설치됩니다. 로컬 파일 공유에 설치하려면 디바이스의 '로컬 시스템'에 공유에 대한 액세스 권한이 있어야 합니다.

이 시나리오에 대한 요구 사항은 다음과 같습니다.

  • 앱의 위치는 로컬 파일 시스템(C:\StagedApps\app1.appx), UNC 경로(\\server\share\app1.apx) 또는 HTTPS 위치(https://contoso.com/app1.appx\)일 수 있습니다.
  • 사용자에게 콘텐츠 위치에 액세스할 수 있는 권한이 있어야 합니다. HTTP의 경우 등록과 연결된 인증서를 사용하여 서버 인증 또는 인증서 인증을 사용할 수 있습니다. HTTP 위치는 지원되지만 인증 요구 사항이 부족하여 권장되지 않습니다.
  • 디바이스는 Microsoft 스토어에 연결하거나 서비스를 사용하도록 설정할 필요가 없습니다.
  • 디바이스에는 Azure AD ID 또는 도메인 멤버 자격이 필요하지 않습니다.
  • 비스토어 앱의 경우 디바이스의 잠금을 해제해야 합니다.
  • 오프라인 앱 스토어의 경우 앱을 배포하기 전에 필요한 라이선스를 배포해야 합니다.

호스트된 위치에서 디바이스의 모든 사용자에 대한 앱을 프로비전하기 위해 관리 서버는 디바이스 컨텍스트의 AppInstallation 노드에서 추가 및 Exec 명령을 실행합니다. 등록 취소 시 앱을 적절하게 제거하려면 패키지 패밀리 이름에 대한 Add 명령이 필요합니다.

참고

프로비전된 앱을 제거하면 이미 앱을 설치한 사용자에서 제거되지 않습니다.

다음은 앱 설치의 예입니다.

참고

데스크톱 버전에 대한 Windows 10만 지원됩니다.

<!-- Add PackageFamilyName -->
<Add>
   <CmdID>0</CmdID>
   <Item>
      <Target>
         <LocURI>./Device/Vendor/MSFT/EnterpriseModernAppManagement/AppInstallation/{PackageFamilyName</LocURI>
      </Target>
   </Item>
</Add>
<!-- Provision appx to device -->
<Exec>
   <CmdID>1</CmdID>
   <Item>
      <Target>
         <LocURI>./Device/Vendor/MSFT/EnterpriseModernAppManagement/AppInstallation/{PackageFamilyName}/HostedInstall</LocURI>
      </Target>
      <Meta>
         <Format xmlns="syncml:metinf">xml</Format>
      </Meta>
      <Data><Application PackageUri="\\server\share\HelloWorld10.appx" /></Data>
   </Item>
</Exec>

HostedInstall Exec 명령에는 포함된 XML이 필요한 데이터 노드가 포함되어 있습니다. 데이터 XML에 대한 요구 사항은 다음과 같습니다.

  • 애플리케이션 노드에는 로컬 파일 위치, UNC 또는 HTTPS 위치일 수 있는 필수 매개 변수 PackageURI가 있습니다.
  • 패키지와 함께 설치해야 하는 경우 종속성을 지정할 수 있습니다. 이것은 선택 사항입니다.

DeploymentOptions 매개 변수는 사용자 컨텍스트에서만 사용할 수 있습니다.

다음은 종속성이 있는 앱 설치의 예입니다.

참고

데스크톱 버전에 대한 Windows 10만 지원됩니다.

<!-- Add PackageFamilyName -->
<Add>
   <CmdID>0</CmdID>
   <Item>
      <Target>
         <LocURI>./Device/Vendor/MSFT/EnterpriseModernAppManagement/AppInstallation/{PackageFamilyName</LocURI>
      </Target>
   </Item>
</Add>
<!-- Provision appx with framework dependencies-->
<Exec>
   <CmdID>1</CmdID>
   <Item>
      <Target>
         <LocURI>./Device/Vendor/MSFT/EnterpriseModernAppManagement/AppInstallation/{PackageFamilyName}/HostedInstall</LocURI>
      </Target>
      <Meta>
         <Format xmlns="syncml:metinf">xml</Format>
      </Meta>
      <Data>
         <Application PackageUri="\\server\share\HelloWorld10.appx" />
            <Dependencies>
                     <Dependency PackageUri=”\\server\share\HelloWorldFramework.appx” />
               <Dependency PackageUri="\\server2\share\HelloMarsFramework.appx"/>
            </Dependencies>
         </Application>
      </Data>
   </Item>
</Exec>

앱 설치 상태 가져오기

앱 설치가 완료되면 Windows 알림이 전송됩니다. AppInstallation 노드를 사용하여 상태를 쿼리할 수도 있습니다. 쿼리에서 다시 가져올 수 있는 정보 목록은 다음과 같습니다.

  • 상태 - 앱 설치 상태를 나타냅니다.

    • NOT_INSTALLED (0) - 노드가 추가되었지만 실행이 완료되지 않았습니다.
    • 설치(1) - 실행이 시작되었지만 배포가 완료되지 않았습니다. 성공에 관계없이 배포가 완료되면 이 값이 업데이트됩니다.
    • FAILED (2) - 설치에 실패했습니다. 오류의 세부 정보는 LastError 및 LastErrorDescription에서 찾을 수 있습니다.
    • INSTALLED (3) - 설치에 성공하면 이 노드가 정리됩니다. 정리 작업이 완료되지 않은 경우 이 상태가 잠시 나타날 수 있습니다.
  • LastError - 앱 배포 서버에서 보고한 마지막 오류입니다.

  • LastErrorDescription - 앱 배포 서버에서 보고한 마지막 오류를 설명합니다.

  • 상태 - 앱 설치 진행률을 나타내는 정수입니다. HTTPS 위치의 경우 이 상태는 예상 다운로드 진행률을 표시합니다.

    상태는 프로비저닝에 사용할 수 없으며 사용자 기반 설치에만 사용됩니다. 프로비저닝의 경우 값은 항상 0입니다.

앱이 성공적으로 설치되면 노드가 정리되고 더 이상 존재하지 않습니다. 앱의 상태는 AppManagement 노드에서 보고할 수 있습니다.

다음은 특정 앱 설치에 대한 쿼리의 예입니다.

<!-- Get all app status under AppInstallation for a specific app-->
<Get>
   <CmdID>2</CmdID>
   <Item>
      <Target>
         <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppInstallation/{PackageFamilyName}?list=StructData</LocURI>
      </Target>
   </Item>
</Get>

다음은 모든 앱 설치에 대한 쿼리의 예입니다.

<!-- Get all app status under AppInstallation-->
<Get>
   <CmdID>2</CmdID>
   <Item>
      <Target>
         <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppInstallation?list=StructData</LocURI>
      </Target>
   </Item>
</Get>

설치 완료에 대한 경고

애플리케이션 설치를 완료하는 데 다소 시간이 걸릴 수 있습니다. 따라서 비동기적으로 수행됩니다. Exec 명령이 완료되면 클라이언트는 실패 또는 성공 여부에 관계없이 상태의 알림을 관리 서버에 보냅니다.

다음은 경고의 예입니다.

<Alert>
    <CmdID>4</CmdID>
    <Data>1226</Data>
        <Item>
            <Source>
                <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppInstallation/{PackageFamilyName}/HostedInstall</LocURI>
            </Source>
            <Meta>
                <Type xmlns="syncml:metinf">Reversed-Domain-Name:com.microsoft.mdm.EnterpriseHostedAppInstall.result</Type>
                <Format xmlns="syncml:metinf">int</Format>
            </Meta>
            <Data>0</Data>
        </Item>
</Alert>

사용자 기반 설치의 경우 ./User 경로를 사용하고 앱을 프로비전하려면 ./Device 경로를 사용합니다.

데이터 필드 값 0(0)은 성공을 나타냅니다. 그렇지 않으면 오류 코드입니다. 오류가 발생하면 AppInstallation 노드에서 자세한 내용을 확인할 수 있습니다.

참고

현재 스토어 앱 설치에 대한 경고는 아직 사용할 수 없습니다.

앱 제거

Windows 10 디바이스에서 사용자의 앱을 제거할 수 있습니다. 앱을 제거하려면 CSP의 AppManagement 노드에서 앱을 삭제합니다. AppManagement 노드 내에서 패키지는 다음 노드에 따라 원본에 따라 구성됩니다.

  • AppStore - 이러한 앱은 Microsoft 스토어용입니다. 스토어에서 직접 앱을 설치하거나 비즈니스용 스토어에서 엔터프라이즈로 배달할 수 있습니다.
  • nonStore - Microsoft Store에서 획득하지 않은 앱입니다.
  • 시스템 - 이러한 앱은 OS의 일부입니다. 이러한 앱은 제거할 수 없습니다.

앱을 제거하려면 원본 노드, 패키지 패밀리 이름 및 패키지 전체 이름 아래에서 앱을 삭제합니다. XAP를 제거하려면 패키지 패밀리 이름 및 패키지 전체 이름 대신 제품 ID를 사용합니다.

다음은 사용자에 대한 앱의 모든 버전을 제거하는 예제입니다.

<!-- Uninstall App for a Package Family-->
<Delete>
   <CmdID>1</CmdID>
   <Item>
      <Target>
         <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppManagement/AppStore/{PackageFamilyName}</LocURI>
      </Target>
   </Item>
</Delete>

다음은 사용자에 대한 특정 버전의 앱을 제거하는 예제입니다.

<!-- Uninstall App for a specific package full name-->
<Delete>
   <CmdID>1</CmdID>
   <Item>
      <Target>
         <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppManagement/AppStore/{PackageFamilyName}/{PackageFullName}</LocURI>
      </Target>
   </Item>
</Delete>

디바이스에서 프로비전된 앱 제거

특정 버전 또는 패키지 패밀리의 모든 버전에 대해 디바이스에서 프로비전된 앱을 제거할 수 있습니다. 프로비전된 앱이 제거되면 디바이스에 대한 이후 사용자가 사용할 수 없습니다. 앱이 등록된 로그인한 사용자는 앱에 계속 액세스할 수 있습니다. 해당 사용자의 앱을 제거하려면 해당 사용자에 대한 앱을 명시적으로 제거해야 합니다.

참고

인벤토리 값이 IsProvisioned = 1인 앱만 제거할 수 있습니다.

프로비전된 앱 제거는 디바이스 컨텍스트에서 발생합니다.

디바이스에서 프로비전된 앱을 제거하는 예제는 다음과 같습니다.

<!— Remove Provisioned App for a Package Family-->
<Delete>
   <CmdID>1</CmdID>
   <Item>
      <Target>
         <LocURI>./Device/Vendor/MSFT/EnterpriseModernAppManagement/AppManagement/AppStore/{PackageFamilyName}</LocURI>
      </Target>
   </Item>
</Delete>

디바이스에서 프로비전된 앱의 특정 버전을 제거하는 예제는 다음과 같습니다.

<!-- Remove Provisioned App for a specific package full name-->
<Delete>
   <CmdID>1</CmdID>
   <Item>
      <Target>
         <LocURI>./Device/Vendor/MSFT/EnterpriseModernAppManagement/AppManagement/AppStore/{PackageFamilyName}/{PackageFullName}</LocURI>
      </Target>
   </Item>
</Delete>

스토어 앱 라이선스 제거

콘텐츠 ID에 따라 앱당 디바이스에서 앱 라이선스를 제거할 수 있습니다.

다음은 사용자에 대한 앱 라이선스를 제거하는 예제입니다.

<!-- Remove App License for a User-->
<Delete>
   <CmdID>1</CmdID>
   <Item>
      <Target>
         <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppLicenses/StoreLicenses/{license id}</LocURI>
      </Target>
   </Item>
</Delete>

다음은 프로비전된 패키지(디바이스 컨텍스트)에 대한 앱 라이선스를 제거하는 예제입니다.

<!-- Remove App License for a provisioned package (device) -->
<Delete>
   <CmdID>1</CmdID>
   <Item>
      <Target>
         <LocURI>./Device/Vendor/MSFT/EnterpriseModernAppManagement/AppLicenses/StoreLicenses/{license id}</LocURI>
      </Target>
   </Item>
</Delete>

앱 제거에 대한 경고

앱을 제거하는 데 다소 시간이 걸릴 수 있습니다. 따라서 제거는 비동기적으로 실행됩니다. Exec 명령이 완료되면 클라이언트는 실패 또는 성공 여부에 관계없이 상태의 알림을 관리 서버에 보냅니다.

사용자 기반 제거의 경우 LocURI에서 ./User를 사용하고 프로비저닝의 경우 LocURI에서 ./Device를 사용합니다.

예를 들면 다음과 같습니다. 호스트된 앱 및 스토어 앱에는 단 하나의 제거만 있습니다.

<Alert>
    <Data>1226</Data>
    <Item>
        <Source>
            <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppManagement/{PackageFamilyName}</LocURI>
        </Source>
        <Meta>
            <Type xmlns="syncml:metinf">Reversed-Domain-Name:com.microsoft.mdm.EnterpriseAppUninstall.result</Type>
            <Format xmlns="syncml:metinf">int</Format>
        </Meta>
        <Data>0</Data>
    </Item>
</Alert>

앱 업데이트

디바이스에 설치된 앱은 관리 서버를 사용하여 업데이트할 수 있습니다. 앱은 스토어에서 직접 업데이트하거나 호스트된 위치에서 설치할 수 있습니다.

스토어에서 직접 앱 업데이트

Microsoft Store에서 앱을 업데이트하려면 디바이스에 스토어 서비스와 연결해야 합니다.

다음은 업데이트 검사의 예입니다.

<!— Initiate a update scan for a user-->
<Exec>
   <CmdID>1</CmdID>
   <Item>
      <Target>
         <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppManagement/UpdateScan</LocURI>
      </Target>
   </Item>
</Exec>

다음은 상태 검사의 예입니다.

<!— Get last error related to the update scan-->
<Get>
   <CmdID>1</CmdID>
   <Item>
      <Target>
         <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppManagement/LastScanError</LocURI>
      </Target>
   </Item>
</Get>

호스트된 위치에서 앱 업데이트

기존 앱을 업데이트하는 것은 초기 설치와 동일한 프로세스를 따릅니다. 자세한 내용은 호스트된 위치에서 사용자에게 앱 배포를 참조하세요.

프로비전된 앱 업데이트

앱 업데이트가 사용자에게 전송되면 프로비전된 앱이 자동으로 업데이트됩니다. 초기 프로비저닝과 동일한 프로세스를 사용하여 프로비전된 앱을 업데이트할 수도 있습니다. 초기 프로비저닝에 대한 자세한 내용은 디바이스의 모든 사용자에 대한 앱 프로비전을 참조하세요.

앱의 자동 업데이트 방지

특정 앱이 자동으로 업데이트되지 않도록 방지할 수 있습니다. 이 기능을 사용하면 IT 관리자가 정의한 대로 특정 앱이 제외된 앱에 대한 자동 업데이트를 켤 수 있습니다.

업데이트를 해제하는 것은 디바이스 수준에서 Microsoft Store의 업데이트에만 적용됩니다. 이 기능은 사용자 수준에서 사용할 수 없습니다. 오프라인 패키지가 호스트된 설치 위치에서 푸시되는 경우에도 앱을 업데이트할 수 있습니다.

예를 들면 다음과 같습니다.

<!— Prevent app from being automatically updated-->
<Replace>
   <CmdID>1</CmdID>
   <Item>
      <Target>
         <LocURI>./Device/Vendor/MSFT/EnterpriseModernAppManagement/AppManagement/AppStore/{PackageFamilyName}/DoNotUpdate</LocURI>
         </Target>
      <Meta>
         <Format xmlns="syncml:metinf">int</Format>
         <Type xmlns="syncml:metinf">text/plain</Type>
      </Meta>
      <Data>1</Data></Item>
</Replace>

더 많은 앱 관리 시나리오

다음 하위 섹션에서는 추가 설정 구성에 대한 정보를 제공합니다.

공유 사용자 앱 데이터 사용

유니버설 Windows 앱은 디바이스 사용자 간에 애플리케이션 데이터를 공유할 수 있습니다. 데이터 공유 기능은 패키지 패밀리 수준 또는 디바이스별로 설정할 수 있습니다.

참고

이는 다중 사용자 디바이스에만 적용됩니다.

정책 CSP의 AllowSharedUserAppData 정책은 여러 사용자가 있을 때 앱 패키지가 앱 패키지 간에 데이터를 공유하도록 설정하거나 사용하지 않도록 설정합니다. 이 정책을 사용하도록 설정하면 애플리케이션은 패키지 패밀리의 패키지 간에 데이터를 공유할 수 있습니다. 해당 패키지 패밀리 및 로컬 컴퓨터에 대한 ShareLocal 폴더를 통해 데이터를 공유할 수 있습니다. 이 폴더는 Windows.Storage API를 통해 사용할 수 있습니다.

이 정책을 사용하지 않도록 설정하면 애플리케이션에서 여러 사용자 간에 사용자 애플리케이션 데이터를 공유할 수 없습니다. 그러나 미리 작성된 공유 데이터는 유지됩니다. 미리 작성된 깨끗한 공유 데이터는 DISM((/Get-ProvisionedAppxPackage)을 사용하여 공유 데이터가 있는지 감지하고 /Remove-SharedAppxData를 사용하여 제거합니다.

유효한 값은 0(끄기, 기본값) 및 1(켜기)입니다.

예를 들면 다음과 같습니다.

<!-- Get policy (Default)-->
<Get>
   <CmdID>1</CmdID>
   <Item>
      <Target>
         <LocURI>./Vendor/MSFT/Policy/Result/ApplicationManagement/AllowSharedUserAppData?list=StructData</LocURI>
      </Target>
   </Item>
</Get>
<!-- Update policy -->
<Replace>
   <CmdID>2</CmdID>
   <Item>
      <Target>
         <LocURI>./Vendor/MSFT/Policy/Config/ApplicationManagement/AllowSharedUserAppData</LocURI>
      </Target>
   <Meta>
      <Format>int</Format>
      <Type>text/plain</Type>
   </Meta>
   <Data>1</Data>
   </Item>
</Replace>