Здравствуйте, CRT, Вы писали:
CRT>Здравствуйте, _AND, Вы писали:
CRT>>>а как ты будешь поступать когда пользователь поменяет железо и обратится к тебе c просьбой сделать так чтобы его ключ работал на новом железе?
_AN>>Сбросить его регистрацию и попросить перерегистрировать с тем же ключом?
CRT>тогда возникает еще один вопрос. А если он через неделю еще раз попросит, а потом через неделю еще раз, потом еще раз. Что будешь делать?
Недавно уже было обсуждение, я там подробно писал, что я делаю в таком случае.
Если коротко — попрошу объяснить причину и посмотрю, какие именно параметры привязки у него меняются.
По этой информации делаю вывод, позволить перерегистрацию или нет. Пока что в таких ситуациях (очень редких) всегда продлял.
Встречал такой вариант — это если много пользователей (не мой вариант — на каждый ключ есть несколько (3-5) попыток регистрации (при этом нигде явно это не говорится), если пользователю нужно больше — он пишет и объясняет.
Здравствуйте, icezone, Вы писали:
I>Ваш аттач с ключевым файлом могут антивирусники порезать.
Почему мой? К тому же не припомню случая чтобы какие-нибудь вложения резались, если конечно это не exe или по 10 мегов.
З.Ы. Я не вижу приемуществ файлов перед короткими ключами. Много лет назад мы использовали файлы, но на то были причины, которые уже давно устранены.
CRT>а как ты будешь поступать когда пользователь поменяет железо и обратится к тебе c просьбой сделать так чтобы его ключ работал на новом железе?
Мне кажется оптимальным решением будет давать пользователю возможность 2-3 раза сменить железо и соответственно серийный номер.
Указать это в лицензионном соглашении. При этом ключи выписывать автоматически на своем сайте. Всякие бывают ситуации, и всех можно
понять и иногда увеличить данное число регистраций.
Здравствуйте, Nonmanual Worker, Вы писали:
NW>Почему мой? К тому же не припомню случая чтобы какие-нибудь вложения резались, если конечно это не exe или по 10 мегов.
Упс, это DarkMaster'у должно быть адресовано. Аттачи режутся у корпоративщиков, меня даже заранее перед покупкой об этом предупреждали.
Здравствуйте, edton, Вы писали:
E>Еще 15 лет назад наши классики шаровары вроде Каталова писали что привязка к железу — плохая идея.
Плюсую.
У меня полно разнообразного софта, но ни один не привязывается к железу и не лезет ни на какие
серверы для всяких там своих проверок. А железо я обновляю периодически, гораздо чаще чем раз в
пять лет. И если бы каждая вторая прога при этом требовала перерегистрации, так ну в баню
такой софт — лучше найти альтернативные программы и не мучиться.
Здравствуйте, byterus, Вы писали:
B>Здравствуйте, okman, Вы писали:
O>>На моем компе в соответствующем ключе под Wow6432Node запись MachineGuid отсутствует.
B>Вы код запускали? У меня куча пользователей на 64 бит системах.
А вы сами подебажте и посмотрите.
На 7ке 64битной, при условии что приложение 32х битное, записи MachineGuid не увидите.
Может быть у вас при невозможности чтения какое-нибудь дефолтное значение используется?
Здравствуйте, _AND, Вы писали:
_AN>А вы сами подебажте и посмотрите. _AN>На 7ке 64битной, при условии что приложение 32х битное, записи MachineGuid не увидите. _AN>Может быть у вас при невозможности чтения какое-нибудь дефолтное значение используется?
Ребята, кончайте пугать блин! Все работает, и у пользователей и на виртуалке. По умолчанию используется UNKNOWN_(рандом набор цифр), если бы не работало то пользователям пришлось бы активацию делать каждый раз при запуске.
Здравствуйте, byterus, Вы писали:
B>Здравствуйте, okman, Вы писали:
O>>На моем компе в соответствующем ключе под Wow6432Node запись MachineGuid отсутствует.
B>Вы код запускали? У меня куча пользователей на 64 бит системах.
Здравствуйте, DarkMaster, Вы писали:
DM>Здравствуйте, LupakovO, Вы писали:
LO>>Написал программу на Delphi. Хочу сделать привязку к конкретному компьютеру, подскажите, как лучше реализовать? К чему привязываться? LO>>Я вроде слышал 3 года назад, что теперь процессоры и материнские платы не содержат уникального ID. Это правда? LO>>Кто-то советует к жесткому диску, но вроде жесткие диски содержат движущиеся части и ломаются чаще. Поэтому прошу совета у специалистов.
DM>Тебе лучше к шароварщикам обратится. Основные места привязки: материнские платы, винты, система. Винты — не всегда можно точно привязаться — информация, доставаемая через GetVolumeInformation() может быть легко изменена. То же самое относится к системе (Windows ID) — переставили систему — все уехало. Доступ к ID материнки — отдельная песня. Я бы не заморачивался и сделал бы шифрованный ключевой файл. Файл есть и его содержимое корректно — работаем, если нет — прошу на регистрацию, работаем в демо режиме.
DM>P.S. Можно использовать и навесную защиту и комбинацию разных защит — все зависит от того, что программа делает.
Тяжелое детство было у советских шароварщиков. Возьмите любой популярный продует — нет там никакой привязки к железу!
Здравствуйте, okman, Вы писали:
O>>>На моем компе в соответствующем ключе под Wow6432Node запись MachineGuid отсутствует.
Странно, сейчас откомпилировал Delphi-вариант (разумеется, результат 32-битный), он работает корректно в Windows 7 SP1 64-bit, и с привилегиями, и без них.
Больше того :) Проверил в Windows 8 Developer Preview 64-bit (правда, в виртуальной машине), там тоже всё работает.
Здравствуйте, Disker, Вы писали:
D>Странно, сейчас откомпилировал Delphi-вариант (разумеется, результат 32-битный), он работает корректно в Windows 7 SP1 64-bit, и с привилегиями, и без них.
Вот она — обратная сторона велосипедостроения в области защиты.
На одной машине работает, на другой — нет.
Здравствуйте, LupakovO, Вы писали:
LO>Здравствуйте.
LO>Написал программу на Delphi. Хочу сделать привязку к конкретному компьютеру, подскажите, как лучше реализовать? К чему привязываться? LO>Я вроде слышал 3 года назад, что теперь процессоры и материнские платы не содержат уникального ID. Это правда? LO>Кто-то советует к жесткому диску, но вроде жесткие диски содержат движущиеся части и ломаются чаще. Поэтому прошу совета у специалистов.
Я вот так сделал, через WMI. Сначала дергаю серийник мамки, если не получилось (на моем компе и не получилось, выдает " " строку), то серийник процессора. А потом по этому считаю crc32.
Сейчас проверил — у нескольких пользователей действительно ключ одинаковый — надо наверно еще способ добавить.
Потом по номеру лицензии, hwid и прочей инфе генерю ключевой файл в xml, и отсылаю пользователю. Он его просто драг-энд-дропает в окошко ввода лицензии и все. Ну и в письме дублирую даннные, для ручного ввода.
inline
RCODE getHardwareId( ::std::string &serial )
{
::std::string tmp;
RCODE res = getWmiValueHelper( tmp, "Win32_BaseBoard", L"SerialNumber" );
if (res) return res;
::marty::util::trim( tmp , ::marty::util::CIsSpace<char>() );
if (!tmp.empty())
{
serial = crc32ToString( ::crctools::crc32( tmp ) );
return EC_OK;
}
res = getWmiValueHelper( tmp, "Win32_Processor", L"ProcessorId" );
if (res) return res;
::marty::util::trim( tmp , ::marty::util::CIsSpace<char>() );
if (!tmp.empty())
{
serial = crc32ToString( ::crctools::crc32( tmp ) );
return EC_OK;
}
serial = crc32ToString( ::crctools::crc32( ::std::string("1234567890") ) );
return EC_OK;
//EC_UNKNOWN
}
inline
RCODE getWmiValueHelper( ::std::string &serial, const ::std::string &category, const ::std::wstring &valueName )
{
// Step 1: --------------------------------------------------
// Initialize COM. ------------------------------------------
//HRESULT hres = CoInitializeEx(0, COINIT_MULTITHREADED);
HRESULT hres = CoInitialize(0);
if (FAILED(hres))
{
return HR2RC(hres);
}
// Step 2: --------------------------------------------------
// Set general COM security levels --------------------------
// Note: If you are using Windows 2000, you need to specify -
// the default authentication credentials for a user by using
// a SOLE_AUTHENTICATION_LIST structure in the pAuthList ----
// parameter of CoInitializeSecurity ------------------------
hres = CoInitializeSecurity(
NULL,
-1, // COM authentication
NULL, // Authentication services
NULL, // Reserved
RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication
RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation
NULL, // Authentication info
0, // EOAC_NONE, // Additional capabilities
NULL // Reserved
);
if (FAILED(hres) && hres!=RPC_E_TOO_LATE)
{
CoUninitialize();
return HR2RC(hres);
}
// Step 3: ---------------------------------------------------
// Obtain the initial locator to WMI -------------------------
IWbemLocator *pLoc = NULL;
hres = CoCreateInstance(
CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (LPVOID *) &pLoc);
if (FAILED(hres))
{
CoUninitialize();
return HR2RC(hres);
}
// Step 4: -----------------------------------------------------
// Connect to WMI through the IWbemLocator::ConnectServer method
IWbemServices *pSvc = NULL;
// Connect to the root\cimv2 namespace with
// the current user and obtain pointer pSvc
// to make IWbemServices calls.
hres = pLoc->ConnectServer(
_bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace
NULL, // User name. NULL = current user
NULL, // User password. NULL = current
0, // Locale. NULL indicates current
NULL, // Security flags.
0, // Authority (e.g. Kerberos)
0, // Context object
&pSvc // pointer to IWbemServices proxy
);
if (FAILED(hres))
{
pLoc->Release();
CoUninitialize();
return HR2RC(hres);
}
// Step 5: --------------------------------------------------
// Set security levels on the proxy -------------------------
hres = CoSetProxyBlanket(
pSvc, // Indicates the proxy to set
RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx
RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx
NULL, // Server principal name
RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx
RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
NULL, // client identity
0 // EOAC_NONE // proxy capabilities
);
if (FAILED(hres))
{
pSvc->Release();
pLoc->Release();
CoUninitialize();
return HR2RC(hres);
}
// Step 6: --------------------------------------------------
// Use the IWbemServices pointer to make requests of WMI ----
// For example, get the name of the operating system
IEnumWbemClassObject* pEnumerator = NULL;
::std::string selectQuery = ::std::string("SELECT * FROM ") + category;
hres = pSvc->ExecQuery(
bstr_t("WQL"),
bstr_t(selectQuery.c_str()), // Win32_Processor, Win32_BaseBoard
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator);
if (FAILED(hres))
{
pSvc->Release();
pLoc->Release();
CoUninitialize();
return HR2RC(hres);
}
// Step 7: -------------------------------------------------
// Get the data from the query in step 6 -------------------
IWbemClassObject *pclsObj;
ULONG uReturn = 0;
while (pEnumerator)
{
HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
&pclsObj, &uReturn);
if(0 == uReturn)
{
break;
}
VARIANT vtProp;
// Get the value of the SerialNumber property
//hr = pclsObj->Get(L"ProcessorId", 0, &vtProp, 0, 0); // ProcessorId, SerialNumber
hr = pclsObj->Get(valueName.c_str(), 0, &vtProp, 0, 0); // ProcessorId, SerialNumber
//wcout << " OS Name : " << vtProp.bstrVal << endl;
::std::wstring serialW = vtProp.bstrVal;
serial = MARTY_UTF::toUtf8(serialW);
VariantClear(&vtProp);
pclsObj->Release();
pclsObj = 0;
}
// Cleanup
// ========
pSvc->Release();
pLoc->Release();
pEnumerator->Release();
if (pclsObj) pclsObj->Release();
CoUninitialize();
return EC_OK;
// marty::winapi
//getWinVer() // 0x0400;
//isWinNt()
}
Здравствуйте, CRT, Вы писали:
CRT>тогда возникает еще один вопрос. А если он через неделю еще раз попросит, а потом через неделю еще раз, потом еще раз. Что будешь делать?
Я над этой ситуацией размышлял, и пришел к выводу, что можно разрешить несколько регистраций (2-3) по одной покупке для разных HWID. Может он на дестоп и на ноут поставить хочет, или приятелю дать — пусть, я не жадный. Но файл активации все равно будет ему на емайл отсылаться, заданный при покупке — т.е. просто так раздавать ключик он не сможет, ему придется в этом участвовать каждый раз. Думаю, его задолбает быстро. Думаю также сделать страничку отмены регистрации с пересылкой подтверждения на его мыло — пусть сам отменяет регистрацию при смене железа. В принципе, отмену регистрации можно лимитировать, но это думаю не слишком актуально.
Здравствуйте, okman, Вы писали:
O>Но MachineGuid все равно меняется после переустановки Windows, так что O>привязкой к компьютеру это назвать нельзя.
Да, меняется, но мне кажется что для пользователя это более естественно чем изменение ID от воткнутой флешки.
А если процедура смены ID происходит без участия службы поддержки так это вообще не проблема.
Здравствуйте, okman, Вы писали:
O>У меня полно разнообразного софта, но ни один не привязывается к железу и не лезет ни на какие O>серверы для всяких там своих проверок. И если бы каждая вторая прога при этом требовала перерегистрации, так ну в баню O>такой софт — лучше найти альтернативные программы и не мучиться.
У меня вроде бы три программы привязаны к железу:
1. Windows
2. Delphi
3. Отечественный протектор
Больше всего волнуюсь за протектор — если перестанет работать сервер активации — не смогу его переустановить в случае переустановки винды.