Export license keys that are already loaded in your system
Every now and then, there is a need to export license keys from a system. I needed to get into the VAR layer to modify code in a Microsoft VPC, but as we all know, Contoso license keys don't come with the BUS/CUS/VAR access codes. So I did what any developer would do:
Disclaimer (ripped from MS)
All code used below is meant for illustration purposes only and is not intended for use in production. The following disclaimer applies to all code used in this blog:
Here is said job, enjoy!
- Write a job to export the Contoso license key file
- Import my company's partner license key file
- DO NOT SYNC when it asks
- Jump in the VAR layer using our layer access code to make my changes real quick
- Import back the Contoso license key file I exported from my job and SYNC
Disclaimer (ripped from MS)
All code used below is meant for illustration purposes only and is not intended for use in production. The following disclaimer applies to all code used in this blog:
THIS CODE IS MADE AVAILABLE AS IS, WITHOUT WARRANTY OF ANY KIND. THE ENTIRE RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS CODE REMAINS WITH THE USER. USE AND REDISTRIBUTION OF THIS CODE, WITH OR WITHOUT MODIFICATION, IS HEREBY PERMITTED.
Here is said job, enjoy!
static void OutputLicenseToText(Args _args) { #define.licenseVersion(2) #define.KeywordLen(20) #define.keywordLicense('License') #define.keywordProperties('Properties') #define.keywordCodes('Codes') #define.keywordCodeLine('CodeLine') #define.keywordDate('Date') #define.keywordSerial('Serial') #define.keywordValue('Value') #define.blank('') #define.space1(' ') #define.space2(' ') #define.space3(' ') #define.spaceHash(' #') #define.OutputFilename(@'C:\OutputLicenseKeys.txt') #define.keywordInfo(1) #define.keywordWarning(2) SysConfig sysConfig; SysLicenseCodeSort sysLicenseCodeSort; container fileOut; int i; System.IO.StreamWriter sw; InteropPermission perm = new InteropPermission(InteropKind::ClrInterop); ; fileOut += "LicenseVersion " + strfmt("%1", #licenseVersion); fileOut += #blank; fileOut += #keywordLicense + #spaceHash + xSysConfig::find(ConfigType::LicenseName,0).Value; fileOut += #blank; fileOut += #space1 + #keywordProperties; fileOut += #space2 + "Name" + #spaceHash + xSysConfig::find(ConfigType::LicenseName,0).Value; fileOut += #space2 + #keywordSerial + #spaceHash + xSysConfig::find(ConfigType::SerialNo,0).Value; fileOut += #space2 + #keywordDate + #spaceHash + xSysConfig::find(ConfigType::LicenseName,1).Value; fileOut += #space1 + "EndProperties"; fileOut += #blank; fileOut += #space1 + #keywordCodes; // Build CodeLines while select sysConfig where sysConfig.configType == ConfigType::AccessCodes && sysConfig.value != #blank join sysLicenseCodeSort order by SortIdx where sysLicenseCodeSort.Id == sysConfig.id { fileOut += #space2 + #keywordCodeLine + #spaceHash + int2str(sysConfig.id + 1); fileOut += #space3 + #keywordValue + #spaceHash + sysConfig.value; fileOut += #space2 + "EndCodeLine"; fileOut += #blank; } fileOut += #blank; fileOut += #space2 + "EndCodes"; fileOut += #space1 + "EndLicense"; // Begin file output perm.assert(); sw = new System.IO.StreamWriter(#OutputFilename); for (i=1; i<=conLen(fileOut); i++) { sw.WriteLine(conPeek(fileOut, i)); } sw.Flush(); sw.Close(); sw.Dispose(); CodeAccessPermission::revertAssert(); info("License successfully output to " + #OutputFil