OnlineSigning_GetUnsignedIL.cpp
[The AD RMS SDK leveraging functionality exposed by the client in Msdrm.dll is available for use in Windows Server 2008, Windows Vista, Windows Server 2008 R2, Windows 7, Windows Server 2012, and Windows 8. It may be altered or unavailable in subsequent versions. Instead, use Active Directory Rights Management Services SDK 2.1, which leverages functionality exposed by the client in Msipc.dll.]
The following code example shows how to create and configure a new unsigned issuance license. The function performs the following actions:
- Calls DRMCreateIssuanceLicense to create an empty issuance license.
- Creates a user object from the user account specified on the command line.
- Creates an EDIT right for the user and associates the right and the user with the new license.
- Creates a GUID and assigns it to the license as a content ID.
#include "OnlineILSigning.h"
/*===================================================================
File: OnlineSigning_GetUnsignedIL.cpp
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (C) Microsoft. All rights reserved.
===================================================================*/
/////////////////////////////////////////////////////////////////////
// The GetUnsignedIL function performs the following:
// - Creates an unsigned issuance license from scratch
// - Associates an EDIT right with a user
// - Adds the user and the right to the license
// - Creates a GUID string to use as a content ID
// - Adds the content ID to the license
// - Returns the unsigned issuance license
//
HRESULT GetUnsignedIL(
PWSTR pwszUserId,
DRMPUBHANDLE* phIssuanceLic)
{
HRESULT hr = S_OK; // HRESULT return code
UINT uiGUIDLength = 0; // GUID length
const UINT GUID_LENGTH = 128; // GUID string length
PWSTR pwszGUID = NULL; // Content ID string
DRMPUBHANDLE hUser = NULL; // User handle
DRMPUBHANDLE hRight = NULL; // Right handle
SYSTEMTIME stTimeFrom; // Validity start
SYSTEMTIME stTimeUntil; // Validity end
GUID guid; // Content ID
// Retrieve the system time to use for the validity
// period in the issuance license.
GetSystemTime(&stTimeFrom);
GetSystemTime(&stTimeUntil);
stTimeUntil.wYear++;
// Create an issuance license.
hr = DRMCreateIssuanceLicense(
&stTimeFrom, // Validity period start
&stTimeUntil, // Validity period end
NULL, // Not used
NULL, // Not used
NULL, // Owner handle
NULL, // Template
NULL, // Bound license
phIssuanceLic); // Unsigned issuance license
if (FAILED(hr)) return hr;
// Create a user object.
hr = DRMCreateUser(
pwszUserId, // User name (SMTP address)
NULL, // User ID
L"Unspecified", // User ID type
&hUser ); // Handle to the user object
if (FAILED(hr)) return hr;
// Create an EDIT right.
hr = DRMCreateRight(
L"EDIT", // Name of the right
&stTimeFrom, // Validity period start
&stTimeUntil, // Validity period end
0, // Extended information length
NULL, // Extended information name
NULL, // Extended information value
&hRight); // Handle to the right
if (FAILED(hr)) goto e_Exit;
// Associate the EDIT right with the user in the issuance license.
hr = DRMAddRightWithUser(
*phIssuanceLic, // Handle to the issuance license
hRight, // Handle to the right
hUser); // Handle to the user
if (FAILED(hr)) goto e_Exit;
// Create a GUID to use as a unique content ID in the license.
hr = CoCreateGuid(&guid);
if (FAILED(hr)) goto e_Exit;
pwszGUID = new WCHAR[GUID_LENGTH];
if(NULL == pwszGUID)
{
hr = E_OUTOFMEMORY;
goto e_Exit;
}
uiGUIDLength = StringFromGUID2(guid, pwszGUID, GUID_LENGTH);
if (0 == uiGUIDLength)
{
delete[] pwszGUID;
hr = E_FAIL;
goto e_Exit;
}
// Set the metadata in the issuance license.
hr = DRMSetMetaData(
*phIssuanceLic, // Handle to the issuance license
pwszGUID, // Content ID
L"MS-GUID", // Content ID type
NULL, // SKU ID
NULL, // SKU ID type
NULL, // Type of content
NULL); // Content display name
e_Exit:
if(NULL != pwszGUID)
{
delete [] pwszGUID;
pwszGUID = NULL;
}
if(NULL != hUser)
{
DRMClosePubHandle(hUser);
hUser = NULL;
}
if(NULL != hRight)
{
DRMClosePubHandle(hRight);
hRight = NULL;
}
return hr;
}
Related topics