Things to Consider Before Issuing Licenses with MS Windows Media Rights Manager

By Andrea Pruneda, Microsoft Streaming Media Division

Summary: There are lots of ways to issue licenses for media files once they've been packaged using Microsoft Windows Media Rights Manager, which means there are many decisions to make before you start issuing licenses. This document lists issues to consider in your decision-making process to help you decide how you want to issue licenses and to evaluate your process and Web site.

On This Page

Introduction Introduction
Getting Started Getting Started
Questions and Answers Questions and Answers
Deciding How You Want to Issue Licenses Deciding How You Want to Issue Licenses
Fore More Information Fore More Information

Introduction

Because there are lots of ways to issue licenses for media files once they've been packaged using Microsoft Windows Media Rights Manager, there are many decisions to make before you start issuing licenses. This document lists questions to consider in your decision making process. If you decide to use the Web site installed with Windows Media Rights Manager, you should review these questions to see if you want to modify the Web site to better suit your needs. If you decide to create your own Web site, you should carefully consider all of these questions before you begin to issue licenses. This document includes the following sections:

  • Getting Started

  • Questions and Answers

  • Deciding How You Want to Issue Licenses

  • Evaluating Your Process and Web Site

  • For More Information

Getting Started

You can issue licenses many different ways for media files you have packaged using Windows Media Rights Manager. If you use the Web site that is installed with Windows Media Rights Manager, you can provide your media files for download on the Internet and issue licenses. In this Web site, distributing media files and issuing licenses for them are separate processes. First, the consumer visits this Web site and downloads packaged media files. Then, when the consumer plays a packaged media file for the first time, the player opens the Web browser to a license acquisition URL in this Web site. After the consumer registers by entering a few items of information, such as an e-mail address, a license that does not expire is issued, allowing the consumer to play the media file, transfer it to a portable device, and recover the license as needed.

Windows Media Rights Manager is completely flexible and can be quickly customized to suit your requirements. You can modify the ASP script in the Windows Media Rights Manager Web site or develop an entirely different Web site to create a unique process for distributing media files and issuing licenses. Regardless of what you decide to do, you should consider the questions in this document to help determine what will work best for you.

Questions and Answers

This section lists questions to consider in three main areas: deciding how you want to issue licenses, evaluating your process, and evaluating your Web site.

Deciding How You Want to Issue Licenses

You can issue licenses in different ways and at different times, depending on the results you want. The topics in this section are designed to help you to answer the following questions so you can determine the way you want your Web site to work:

  • Do you want to require anything in return for a license, such as payment or registration information?

  • Do you want to make consumers aware of licenses?

  • When do you want to issue a licensebefore or after a consumer downloads the media file? Do you want to hide the licensing process from the consumer, or do you want the consumer to be aware of this step?

  • Do you want to change or set the license properties, such as the rights, expiration, and minimum required security level?

  • Do you want to issue multiple licenses for each media file?

  • Are you performing every role in this process, or are multiple sites working together to package and distribute media files, collect payment, and issue licenses?

  • Do you want to set up subscriptions?

  • Do you want to stream media files to consumers?

Do you want to require anything in return for a license, such as payment or registration information?

You can build a step into your process to require something from the consumer in exchange for a license. One way to promote and advertise music on the Internet is to give it away for free, but you might ask consumers to register in exchange for a license. Collecting registration information can help you determine who is interested in your music, and you can collect e-mail addresses to generate a mailing list.

Another possibility is to require payment. Because media files can be copied and shared, it is better to require and verify payment when you are issuing a license (which cannot be copied or shared) rather than when the consumer downloads the media file.

Do you want to make consumers aware of licenses?

You can choose whether to describe the concept of licenses to your consumers. The concept of packaged media files with licenses is a relatively new one that might not be obvious to consumers. You might issue licenses in an invisible background process and decide that consumers do not need to understand that packaged media files require licenses. Or, you might issue licenses as a separate step after a media file has been downloaded and decide to explain what licenses are. The deciding factor might be the terms of the licenses you issue.

For example, you might hide this concept from consumers to simplify your process. Consumers will then associate the rights and terms of the license with the media file itself. For example, if a license has expired, the consumer will think that the media file itself has expired and will not seek a new license for it.

Or, you might provide text on your Web site explaining what licenses are and how they work. For example, as a promotion, consumers download a song from your Web site and receive a license that expires after one week. Consumers who then pay for the song will receive a new license that does not expire. So that consumers understand that they are receiving a new license and not downloading a large file a second time, you might explain that you are issuing a new license.

In addition, if you allow license recovery, you will need to explain this process to consumers. For example, a consumer transfers packaged media files purchased from your Web site to a new computer. Unless you want to ask the consumer to pay again, you can reissue the licenses for these media files.

When do you want to issue a licensebefore or after a consumer downloads the media file? Do you want to hide the licensing process from the consumer, or do you want the consumer to be aware of this step?

The Web site that is installed with Windows Media Rights Manager issues a license after a consumer downloads a packaged media file and tries to play it for the first time. The license acquisition URL stored in the media file opens a Web page that runs the license acquisition script. In this method, consumers must perform separate steps to obtain packaged media files and to acquire licenses.

Another possibility is to issue licenses without making the consumer aware of the process and to reduce the number of steps. You can issue a license before the media file is downloaded, for example, when a consumer pays for a selected media file. Then, the consumer downloads the media file and plays it without having to perform additional steps to acquire a license.

You can issue a license before a media file is downloaded in different ways. The key point is to decide how to trigger license acquisition:

  • Using the selected media file. Load the media file that the consumer selected into a player that has been embedded in a hidden frame in a Web page. License acquisition is triggered when the player loads the file's header. The rest of the media file is not loaded, and the license for the media file is issued.

    The advantage to this method is that it requires very little coding work. The disadvantage to this method is that if the consumer already has a license for the media file, license acquisition is not triggered. Instead, the entire media file is loaded. Since this process might take several minutes and is taking place in a hidden frame, the consumer will not understand what has happened and might think that the process has stopped. For possible solutions, see the topic Evaluating Your Process and Web Site later in this document.

  • Using a global dummy file and the Key Utility object. Create a dummy file (package a very small media file with no content). Load this file into an embedded player in a hidden frame in a Web page to trigger license acquisition. To issue a license for a particular media file, use an unsupported tool (Key Utility object) to change the license request for the dummy file to a license request for the media file you specify. Since you never issue a license for the dummy file, you can always use it to trigger license acquisition.

    The advantage to this method is that very little coding work is involved and this method always works, even when the consumer already has a license for the selected media file (the consumer will never have a license for the dummy file, and this process simply reissues a license for the selected media file). The disadvantage is that you must use an unsupported tool, which might be a concern to you.

  • Using individual dummy files and a key group. Package each media file under a unique key group (a key that you have named). For each media file, create a dummy file (a small media file with no content) and package it under the same key group. The result is that the media file and dummy file are packaged with the same key, so the same license can be used to unlock both files. To trigger license acquisition for a particular media file, load its dummy file into an embedded player in a hidden frame in a Web page. A license is issued for the dummy file. Because the media file uses the same key group, the license for the dummy file also unlocks the media file.

    The advantage to this method is that the dummy file is small and quick to load, so in the event that a consumer already has a license, the process will not appear to stop if license acquisition is not triggered. The disadvantage is that this method requires a significant amount of extra work and file management because you must create a dummy file and key group for each media file.

Understanding How These Examples Work

In these examples, the license acquisition process is hidden to the consumer because the player is embedded in a hidden frame in the consumer's Web browser (this is just one possible implementationyou do not have to use hidden frames). The frame contains an embedded player that opens the media file or dummy file. Consumer feedback (such as registration information) is not required. The player checks for a license; if one is not found, Windows Media License Service issues a license and stores it on the consumer's computer without requesting any registration information. After the license has been issued, the next step in your process might be to direct the consumer to a download location for the selected media file.

Because you load a file into an embedded player, the consumer must have a player that supports being embedded. If the consumer does not have such a player, the license cannot be issued with the media file. Therefore, consider including code in your Web site to check for such a player, for example, when the consumer selects a media file to purchase. You can direct consumers who do not have a suitable player to a download site. For more information, see the topic Evaluating Your Process and Web Site later in this document.

Using the Key Utility Object

When a file is loaded in an embedded player, the player generates a challenge string with a license request. You can use the License Server object to issue a license for a key ID other than the one in the challenge string from the player:

  1. Call the IssueLicense method to get a license string from the challenge string, and then discard this license.

  2. Call the Set method to change the key ID in the license string to the key ID of the license you want to issue (the license for the media file selected by the consumer).

  3. Call IssueLicense again, passing a NULL or empty string as the challenge string to generate a license for a new key ID rather than the one in the challenge string.

The key ID in the Set method should be the encoded key_ID rather than the key_GUID. With a given content_ID, you can find its key_GUID from the drm_copy_state table (use the key_GUID that has a status of 0). Then, to convert this key_GUID to its encoded key_ID form, use the unsupported Key Utility COM object; its functionality is provided in the file Keyutil.dll.

For more information about the Key Utility object, see the article Using the Key Utility Object to Generate Key Information on MSDN Online.

Do you want to change or set the license properties, such as the rights, expiration, and minimum required security level?

You can customize the properties that are contained in the licenses you issue. These properties include rights, expiration, and minimum required application security level.

Rights

Rights specify how a consumer can play a media file and define any other actions that are allowed. The rights you can set adhere to a specification created by the Secure Digital Music Initiative (SDMI), which is an organization that sets standards for secure digital music. The SDMI specification is available on the Secure Digital Music Initiative Web site. A portable device or software module that adheres to the rules described in the SDMI specification is said to be SDMI-compliant.

Currently, you can include the following rights in a license:

  • Allow the media file to be played back on a PC.

  • Allow the media file to be transferred to and played on a portable device that is not SDMI-compliant.

  • Allow the consumer to recover the license. License recovery is a feature that allows the Windows Media License Service to reissue licenses to consumers.

  • Allow the media file to be burned to a CD.

  • Allow the media file to be marked as SDMI-validated content, transferred to an SDMI-compliant portable device, and played back. Only SDMI-validated content can be played on an SDMI-compliant playback device.

  • Allow the license to be used one time, and then delete the license.

  • Allow streams to be saved. Allow a streamed media file to be saved to disk (a Save button appears in the player).

Depending on what you want to allow consumers to do, you can specify which of these rights you want to include in licenses you issue. For example, if you don't want consumers to copy your media files to other devices, you can block the corresponding rights. In some cases, you can issue more than one license for one media file; see the topic Issuing multiple licenses for one media file later in this document.

Expiration

Expiration is the expiration period for licenses. You can set an expiration period that determines the length of time for which a license is valid; then, the expiration date is determined when the license is issued. Or, you can issue licenses that do not expire.

Minimum Required Application Security Level

Minimum required application security level indicates the minimum security level that is required of the playback device. Each playback device application (such as a portable device or Microsoft Windows Media Player) has an application security level to indicate its level of security.

You can specify the minimum application security level you want to require for playing your media files. For example, if you want a large number of people (and a large variety of players) to be able to play your media files, you could set the level to a lower number. Or, to comply with SDMI requirements, you could require a higher level so that only more secure players can be used.

For more information about licenses properties and how to set them, see the article Understanding and Setting License Properties in Windows Media Rights Manager on MSDN Online.

Do you want to issue multiple licenses for each media file?

You can issue multiple licenses to achieve specific results. A common use for issuing multiple licenses is when at least one is a one-time-use license (a license for which the one-time-use right is given). A one-time-use license is used one time and then is deleted. For example, if you issue a license that contains the right to transfer the media file to a portable device and the right to use the license one time, the license is deleted after the consumer transfers the media file to a portable device.

You can issue multiple licenses for one media file when you want to allow the consumer to perform a combination of actions, where at least one action is restricted to one-time use. For example, you want to allow the consumer to play a media file on a PC, transfer it once to a portable device, and burn it once to a CD. You must issue three licenses: the first license contains the right to play content on a PC, the second license contains the rights to one-time use and to transfer content to a portable device, and the third license contains the rights to one-time use and to burn content to a CD.

Sample Code

To issue a license, a license object (LicObj) is created in an ASP page using CreateObject("LicenseServer.LicenseGenerator"), and the IssueLicense method is used to issue the license. To issue more than one license for a given media file, this object is called again for each license. You can also set different rights for each license by defining additional rights variables.

The following code, taken from the Getlic.asp page included with the Web site that is installed with Windows Media Rights Manager, has been modified so that a second license is issued. The Getlic.asp page contains the code that issues licenses. The original page issues one license that allows the consumer to play a media file on a PC, transfer a media file to a portable device, and recover the license. In the code sample below, extra code (displayed in bold text) has been added to this page so that a second license is issued. A new set of rights variables (rights2) has been defined to specify different rights for this licensethis license allows the consumer to transfer a media file to a portable device one time.

<%
    'Microsoft Windows Media Rights Manager v1.0. 
    'Copyright (c) 1999 Microsoft Corporation.  All rights reserved.  
%>
<%
    'Assume that we have challenge, filename, embedded, content_guid, and db_guid are set.
    'embedded and db_guid are not used in this sample file.
    'This page assumes that we have dim for objConn, objRec, strConnString, lngRecs, strSqlQuery.
    'This page also assumes that user_id has been already set to correct value.
    On Error Resume Next
    Dim licObj
    Dim description
    Dim strLicense()
    Dim nIssueId
    Dim days
    Dim appsec(3)
    Dim rights(7)
Dim rights2(7)
    Dim error_code
    Dim error_status
    Dim licLastIndex, licNumber
    Dim licSize
    Dim sorry_message, thanks_message
    Dim show_recovery
    Dim kid
    Dim success
    Dim licTotal, licRecovered
    success       = 0   'Indicates whether to use license.asp or nolicense.asp
    licTotal      = 0   'Indicates total # of distinct kids for which license was issued for this user. Used in recovery case only.
    licRecovered  = 0   'Indicatest actual # of licenses recovered.
    show_recovery = 1   'Indicates whether recovery button is to be shown in the sucess page (i.e license.asp) or not.
    licLastIndex  = -1  'Last Index of strLicense array that contains license.
    licSize       = 100 'Size of the strLicense array
    ReDim strLicense(99)
    ' Set the minimum security level that should be used in the license. 
    ' If  the security level of requesting application is less than this, 
    ' the license will not be issued.
    ' Example: For 1000, it should be set as 0 0 3 232 since 3 * 256 + 232 = 1000.
    appsec(0) = 0
    appsec(1) = 0
    appsec(2) = 0
    appsec(3) = 100
    'For rights, bit 0 (value 1) indicates Play. bit 1 (value 2) indicats Delegate to CE Device.
    '1 0 0 0 indicates that we want to mask all rights except the one for Play.
    '3 0 0 0 indicates that we want to mask all rights except the ones for Play and Delegate to CE Device.
    rights(0) = 3
    rights(1) = 0
    rights(2) = 0
    rights(3) = 0
    'Additional Rights given. 
    '3 0 0 0 indicates that we want to give(even if client does not ask) rights for play on PC and CE device.
    rights(4) = 3
    rights(5) = 0
    rights(6) = 0
    rights(7) = 0
'Rights to be issued for the second license.
    rights2(0) = 0
    rights2(1) = 0
    rights2(2) = 0
    rights2(3) = 0
    'Additional Rights given. 
    '38 0 0 0 indicates that we want to give the right to transfer content to a portable device and delete the license after one use.
    rights2(4) = 38
    rights2(5) = 0
    rights2(6) = 0
    rights2(7) = 0
    'Determine the number of days to expiry for the content from the issue date. It is hardcoded here in the sample.
    'null => unlimited number of days. To specify absolute deadline, compute the number of days from today to the specific date.
    'days = 365
    'days = DateDiff("d", Now(), #5/31/1999#)
     days = null
    error_status = 0
    error_code   = 0
    set licObj  = Server.CreateObject("LicenseServer.LicenseGenerator")
    if (err.Number = 0) then
        call licObj.IssueLicense(strConnString, challenge, CLng(user_id), content_guid, days, rights, appsec, strLicense(0), nIssueId)
        if (err.Number <> 0) then
            error_status = err.Number
            description  = err.Description
            if (description <> "") then
                error_code = CInt(Mid(err.Description, 1, 4))
            end if
        else
            licLastIndex = 0
'Issue the second license 
            call licObj.IssueLicense(strConnString, challenge, CLng(user_id), content_guid, days, rights2, appsec, strLicense(1), nIssueId)
            if (err.Number <> 0) then
                error_status = err.Number
                description  = err.Description
                if (description <> "") then
                    error_code = CInt(Mid(err.Description, 1, 4))
                end if
            else
                success      = 1
                licLastIndex = 1
            end if
        end if
    else
        error_status = err.Number
        description  = err.Description
    end if
%>
    <!-- #include file="recpolicy.asp" -->
<%
    if (recover_licenses = 1 and error_status = 0) then
        'The issue was successful. Retrive all kids from the database for this user and generate license for them too.
        strConnString  = Application("ConnectionString")
        set objConn    = Server.CreateObject("ADODB.Connection")
        if IsObject(objConn) then
           objConn.open strConnString
           if (err.number = 0 and objConn.Errors.Count = 0) then
               strSqlQuery = "select key_id, content_guid, num_days_to_expiry, date_issued from drm_licenses_issued where user_id = '" & user_id & "' order by key_id, date_issued DESC"
               Set objRec = objConn.Execute(strSqlQuery, lngRecs, adCmdText)
               if (IsObject(objRec)) then
                   Dim good
                   kid = ""
                   licLastIndex = -1 'Disregard the license issued first. Since it made an entry, we will reissue that kid.
                   while (NOT objRec.EOF)
                        if (kid <> objRec("key_id")) then
                            kid = objRec("key_id")
                            licTotal = licTotal + 1             
                            good = 0
                            days = objRec("num_days_to_expiry")
                            if (not isnull(days)) then
                                'recompute the number of days. Find the number of days left over.
                                days = DateDiff("d", Now(), DateAdd("d", CDate(objRec("date_issued")), days))
                                if (days > 0) then
                                    good = 1
                                end if
                            else
                                good = 1
                            end if
                            if (good = 1 and AllowRecovery(user_id, kid, objRec("content_guid")) = 1) then
                                'Make sure there is room in the array. If not redim.
                                if (licLastIndex + 1 = licSize) then
                                    ReDim Preserve strLicense(licSize + 100)
                                    licSize = licSize + 100
                                end if
                                call licObj.Set("kid", kid)
                                call licObj.IssueLicense("", "", CLng(user_id), objRec("content_guid"), days, rights, appsec, strLicense(licLastIndex+1), nIssueId)
                                'Set error_code. Last one will prevail.
                                if (err.Number <> 0 and err.Description <> "") then
                                    error_code = CInt(Mid(err.Description, 1, 4))
                                else
                                    success = 1
                                    licRecovered = licRecovered + 1
                                    licLastIndex = licLastIndex + 1
                                end if
                            end if
                        end if
                        objRec.MoveNext
                   wend
               end if
           end if
        end if
        Set objRec  = Nothing
        Set objConn = Nothing        
        show_recovery = 0
    end if
    set licObj = nothing
    if (recovery_flag = 0) then
        sorry_message = "Sorry, we are unable to issue a license to you at this time. Please try later."
        thanks_message = "Thank you for visiting our site and getting a license!"
    else
        sorry_message = "Sorry, we are unable to issue (or recover) any licenses  at this time. Please try later."
        if (licRecovered = licTotal) then
            thanks_message = "Thank you. All your licenses have been successfully restored!"
        else
            thanks_message = "Thank you. " & licRecovered & " licenses out of a total of " & licTotal
            thanks_message = thanks_message & " licenses have been recovered!"
        end if
    end if    
%>
<% if success = 1 then %>
    <!-- #include file="license.asp" -->
<% else %>
    <!-- #include file="nolicense.asp" -->
<% end if %>

Are you performing every role in this process, or are multiple sites working together to package and distribute media files, collect payment, and issue licenses?

You can use a distributed retail model to share the tasks of attracting consumers, packaging media files, distributing media files, collecting payment, and issuing licenses. For example, in one scenario vendors might interact with consumers and collect payment, a clearinghouse might issue licenses, and a content owner might package media files and deliver them to consumers. You must create your distributed retail model to suit your own business needs.

When you set up a distributed retail model, you must consider the following questions:

  • Who is responsible for each task? For example, will content owners supply vendors with packaged media files or will vendors be required to package media files themselves?

  • When working with multiple vendors, how are you going to track each vendor's sales and payments?

  • Do the Web sites in your process work together correctly? For example, if a consumer pays for a media file in a vendor's Web site and then is directed to the content owner's Web site to download the media file, is payment verified at different points in the process? Is it possible for consumers to share a URL with others, allowing payment to be bypassed?

  • Have you considered how your process will work in the event that a media file is shared, and what happens when a consumer who does not have a license tries to play the media file?

Your answers can help you set up your distributed retail model. For example, the way you track sales can depend on who packages media filesthe vendors or the content owner. For more information about setting up a distributed retail model, see the article Setting Up a Distributed Retail Model with Windows Media Rights Manager on MSDN Online.

Do you want to set up subscriptions?

A subscription is a set of media files that can be played with one shared license; in other words, the media files are packaged with the same key group. These media files are locked with the same key, which means that the same license can be used to play them.

If you use the Web site that was installed with Windows Media Rights Manager to distribute and issue licenses, the consumer will have to download and play one media file in a subscription to initiate license acquisition. After this, the consumer can play the other files in the subscription without acquiring more licenses. However, it might make more sense from the consumer's viewpoint for your Web site to issue a license before any media files have been downloaded. For example, a consumer purchases a subscription. Your Web site invisibly issues the license after confirming payment, and then redirects the consumer to a site where he or she can download the media files in the subscription. The consumer can then play these files immediately without having to go through an additional process for license acquisition.

One way you can issue a license for a subscription before the media files are downloaded is to create a dummy media file for each subscription. This dummy media file is included in the key group and should be very small and contain no content because it only initiates the license acquisition process. The consumer will not be aware of this file.

For more information about setting up a subscription this way, see the article Setting Up Media Files for Subscriptions and Streaming on MSDN Online.

Do you want to stream media files to consumers?

When using Microsoft Windows Media Services, you can place packaged media files on a Windows Media server to stream media files to consumers rather than having them download files. The main question in this scenario is when to issue a license. If you implement a license acquisition method similar to the Web site installed with Windows Media Rights Manager, license acquisition begins after a selected media file begins to stream to the consumer. After the consumer meets the conditions you have set for issuing a license (such as payment or registration), the license is issued, and then the media file continues to stream. However, this step in the process could potentially confuse the consumer and lengthens the overall process. One alternative method is to invisibly trigger license acquisition after the consumer selects a media file or after a consumer registers or pays. The consumer simply receives a streamed media file and is not aware of the license acquisition process.

For more information about streaming media files this way, see the article Setting Up Media Files for Subscriptions and Streaming.

Evaluating Your Process and Web Site

After you have decided how you want to implement your site and issue licenses, you should consider the following issues about your process:

  • Does your process take into account that a consumer might already have a license?

    Consumers might already have a license for a particular media file. For example, a consumer might accidentally delete a media file, and then visit your site to download it again. If you have implemented a process to issue licenses before consumers download media files, license acquisition might not work as planned. For example, if you usually trigger license acquisition by loading the media file in a hidden embedded player, license acquisition will not be triggered because the license already exists on the consumer's computer; instead, the player will finish loading the file and then will not progress beyond this stage. One solution is to create logic in your site to prevent this occurrence, for example, by setting up a time-out period. If the page times out, you might update the page by displaying a message telling the consumer that he already has the license to play the media file and include a pointer to the download page. This update should also apply to the frame with the embedded player so that it stops downloading the media file.

  • When a consumer double-clicks a media file for which he or she does not have a license, does the license acquisition URL make sensethat is, does it take the consumer to a logical place in your process?

    Each media file contains a license acquisition URL, which is used to initiate the license acquisition process. When a consumer tries to play an unlicensed media file, the player opens this URL in the consumer's Web browser. So, you should set the license acquisition URL for each media file to a logical page. For example, a consumer purchases a media file, and then shares it with a friend. When the friend tries to play the media file, the player opens the Web browser to the license acquisition URL because a license is not detected. If your site requires payment, a logical URL for license acquisition might be a page where consumers select media files to purchase but not a page that issues licenses because payment has not been made.

After you have decided how you want to implement your site and issue licenses, you should consider the following issues about your Web site:

  • Does your Web site verify that the consumer has a player that can play packaged media files? Does your Web site verify that the consumer has a player that can be embedded?

    To play packaged media files, consumers must have a player that supports this format. These players include Windows Media Player version 6.2 or later and any player that uses the Microsoft Windows Media Audio Software Development Kit (SDK) or Microsoft Windows Media Format SDK. To ensure that consumers who visit your Web site can play packaged media files, you can add script to your site to detect whether a consumer's computer has a compatible player. When a compatible player is not detected, you can help consumers to obtain one before allowing them to continue to download packaged media files.

    To issue licenses before a media file is downloaded and played, you can embed a player in the consumer's Web browser; you can only do this if the consumer has a player that can be embedded. Before trying to issue a license, you can verify that the consumer's computer has a player, such as Windows Media Player, that supports being embedded.

    For more information about detecting players, see the article Detecting a Player on a Consumer's Computer on MSDN Online.

  • Does your Web site accommodate different Web browsers?

    Different Web browsers respond differently in various situations, such as the way consumers download media files. You might test the way your site functions with different browsers and with different versions of browsers.

Fore More Information

To learn more about Windows Media Rights Manager, see Windows Media Rights Manager Help. Windows Media Rights Manager is available for download from the Microsoft Windows Media Technologies page at the Microsoft Web site.

Related articles:

  • Distributing a License with a Media File on MSDN Online.

  • Detecting a Player on a Consumer's Computer on MSDN Online.

  • Using the Key Utility Object to Generate Key Information on MSDN Online.

  • Setting Up Media Files for Subscriptions and Streaming on MSDN Online.

  • Understanding and Setting License Properties in Windows Media Rights Manager on MSDN Online.

  • Setting Up a Distributed Retail Model for Microsoft Windows Media Rights Manager on MSDN Online.