Если кому интересно (чисто в исследовательских целях) какой ключ использовался при установке
WinXP или 2003 сервера на тот или иной компьютер, вот пожалуйста:
#define WINDOWS_KEY_LENGTH 30 // "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX\x0"
static int WINAPI ShuffleBytes(IN OUT PBYTE bData)
{
int nRet = 0;
for (int nByte = 14; nByte >= 0; --nByte)
{
nRet <<= 8;
nRet += bData[nByte];
bData[nByte] = (BYTE)(((__int64)nRet * 0x2AAAAAAB) >> 34);
nRet %= 24;
}
return nRet;
}
static void ProcessKey(IN OUT PBYTE pData, OUT LPTSTR szKey)
{
const LPCTSTR szKeySymbols = _T("BCDFGHJKMPQRTVWXY2346789");
for (int nSymbol = 24;; --nSymbol)
{
szKey[nSymbol] = szKeySymbols[ShuffleBytes(pData)];
if (0 == nSymbol)
break;
if (0 == nSymbol % 5)
{
szKey--;
szKey[nSymbol] = _T('-');
}
}
}
BOOL GetWindowsKey(OUT LPTSTR szKey, IN int nLen)
{
if (nLen < WINDOWS_KEY_LENGTH)
return ::SetLastError(ERROR_INSUFFICIENT_BUFFER), FALSE;
const LPCTSTR szKeyPath = _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion");
const LPCTSTR szKeyName = _T("DigitalProductID");
HKEY hKey;
LONG nSuccess;
PBYTE pData = NULL;
DWORD nDataLength = 0;
nSuccess = ::RegOpenKey(HKEY_LOCAL_MACHINE, szKeyPath, &hKey);
if (ERROR_SUCCESS != nSuccess)
return FALSE;
nSuccess = ::RegQueryValueEx(hKey, szKeyName, NULL, NULL, pData, &nDataLength);
if (ERROR_SUCCESS == nSuccess && nDataLength)
{
pData = (PBYTE)_alloca(nDataLength);
nSuccess = ::RegQueryValueEx(hKey, szKeyName, NULL, NULL, pData, &nDataLength);
if (ERROR_SUCCESS == nSuccess)
{
::RegCloseKey(hKey);
szKey[29] = _T('\x0');
szKey += 4; // Room for 4 '-' symbols
ProcessKey(pData + 52, szKey);
return TRUE;
}
}
// else
DWORD dwError = ::GetLastError();
::RegCloseKey(hKey);
return ::SetLastError(dwError), FALSE;
}
int _tmain(int, _TCHAR*[])
{
TCHAR szKey[WINDOWS_KEY_LENGTH];
if (GetWindowsKey(szKey, WINDOWS_KEY_LENGTH))
_tprintf(_T("%s\n"), szKey);
return 0;
}
Собственно, пример делает все то же самое, что утилитка ViewKeyXP.exe от Сергея Кандакова,
но работает не только на XP, но и на сервере.
Павел.
Интересно, а такой вариант на сервере заработает?
<html>
<!--********************************************************************
'*
'* File: xpkey.hta
'* Created: 2005.12.08
'* Version: 1.0
'*
'********************************************************************-->
<title>xpkey</title>
<HTA:APPLICATION
ID="xpkey"
APPLICATIONNAME="xpkey"
SCROLL="no"
maximizeButton="no"
version="1.0"
SINGLEINSTANCE="yes"
WINDOWSTATE="normal"
SCROLLFLAT="yes"
INNERBORDER="no"
ICON=""/>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<style>
body
{
background-color: buttonface;
font-family: Helvetica;
font-size: 8pt;
margin-top: 10px;
margin-left: 10px;
margin-right: 10px;
margin-bottom: 10px;
}
</style>
<script language="jscript">
function window.onload()
{
self.focus();
self.resizeTo(400,170);
}
//"ProductId"="76487-640-0174977-23796"
//"DigitalProductId"=hex:
// a4,00,00,00,03,00,00,00,37,36,34,38,37,2d,36,34,
// 30,2d,30,31,37,34,39,37,37,2d,32,33,37,39,36,00,
// 2e,00,00,00,41,32,32,2d,30,30,30,30,31,00,00,00,
// 00,00,00,00,
// b2,c8,4b,cc,a5,3f,7d,d3,87,bc,0e,54,
// 36,8a,00,
// 00,00,00,00,00,1a,72,4b,43,90,c1,51,00,
// 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
// 00,00,00,00,00,00,00,00,37,32,36,32,31,00,00,00,
// 00,00,00,00,e6,17,00,00,45,3a,0d,a8,ff,03,00,00,
// f5,26,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
// 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
// c1,6b,73,e5
//"LicenseInfo"=hex:33,b7,21,9d,7e,35,40,38,4f,7c,7e,c6,15,f6,70,d2,a3,f9,cf,90,\
// 86,63,0f,79,7f,f0,04,79,4a,12,1a,33,9e,20,b1,64,ce,b1,0f,5a,8d,1e,b4,b0,4b,\
// 57,da,aa,82,ea,f4,37,90,e3,05,11
var strComputer = ".";
var HKEY_LOCAL_MACHINE = 0x80000002
var HKEY_CURRENT_USER = 0x80000001
//alert(window.location.pathname.substr(0,window.location.pathname.lastIndexOf("\\")+1));
var WshShell = new ActiveXObject("WScript.Shell");
var bTempKey = VBArray(WshShell.RegRead("HKLM\\SOFTWARE\\MICROSOFT\\Windows NT\\CurrentVersion\\DigitalProductId"));
var bKey = new Array
bKey = bTempKey.toArray();
function GetKey()
{
//debugger;
document.getElementById("jskey").value = XPKeyFromProductId(bKey);
}
function XPKeyFromProductId(bKey)
{
var KeyBase = new Array('B', 'C', 'D', 'F', 'G', 'H', 'J','K', 'M', 'P', 'Q', 'R', 'T', 'V', 'W', 'X', 'Y', '2', '3', '4', '6', '7', '8', '9');
var dLen = 29;
var sLen = 15;
var Dst = new Array(dLen);
var StartOffset = 0x34;
var EndOffset = 0x34 + 15
var Src = new Array(15);
for (var i = StartOffset; i<=EndOffset; i++)
{
Src[i-StartOffset] = bKey[i]
}
for (var i = dLen - 1; i>=0; i--)
{
if (((i + 1) % 6) == 0)
{
Dst[i] = '-';
}
else
{
var HN = 0;
for (var n = sLen - 1; n>=0; n--)
{
var Value = (HN << 8) | Src[n];
Src[n] = Value / 24;
HN = Value % 24;
}
Dst[i] = KeyBase[HN];
}
}
var str = "";
for (i = 0; i<=dLen-1; i++)
{
str += Dst[i];
}
return str;
}
function changeKey()
{
var prod_key = document.getElementById("newkey").value;
var re = new RegExp("[0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z]-" +
"[0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z]-" +
"[0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z]-" +
"[0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z]-" +
"[0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z]");
if(!re.test(prod_key))
{
alert("Invalid Product Key!");
return;
}
prod_key = prod_key.replace(/-/,"")
var objProdActiv = GetObject("winmgmts:{impersonationLevel=impersonate}").InstancesOf ("win32_WindowsProductActivation");
var vret = 0;
for(var _enum=new Enumerator(objProdActiv);!_enum.atEnd();_enum.moveNext())
{
var objItem = _enum.item();
try
{
vret = objItem.SetProductKey(prod_key);
alert("Your product key has been successfully updated.");
}
catch(e)
{
alert("An error has occurred. This was probably caused by the keying of an invalid number. Please check it and try again.");
}
}
}
</script>
</head>
<body>
<table>
<td>
<hr>
<input type="button" onclick="GetKey()" title="" value="Get Key" style="font-family:Verdana;font-size:12px;width:90px;">
<input style="font-family:Verdana;font-size:12px;" size="40" type="text" id="jskey" />
<br/><hr>
<input type="button" onclick="changeKey()" title="" value="Change Key" style="font-family:Verdana;font-size:12px;width:90px;">
<input style="font-family:Verdana;font-size:12px;" size="40" type="text" id="newkey" />
<br />
</td>
</tr>
</table>
</body>
</html>
... << RSDN@Home 1.2.0 alpha rev. 622>>
А нет ли честной "заковыривалки ключа" без objItem.SetProductKey(prod_key);? А то он не принимает ключ.