Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Определить уникальность чего-либо на компьютере  [new]
Gold
Member

Откуда: Харьков
Сообщений: 2947
Всем привет!

Есть задача внутри CLR UDF генерировать какой-то уникальный номер, который будет всегда уникальным на данном компьютере или экземпляре Windows.
Пробовал выцепить ID винта, но SQL-сервер не видит System.Management.
Думал так-же получить ID файла dll на диске, но тоже не могу его выцепить.

Нужны идеи. Может кто сталкивался?
28 июн 12, 00:30    [12785973]     Ответить | Цитировать Сообщить модератору
 Re: Определить уникальность чего-либо на компьютере  [new]
aleks2
Guest
1. Вам для чего? Апять тотальная защита от жидомасонского заговора?
2. Если защита - никак.
3. Если просто из любви к искусству - генерируйте newid(), пишите его в реестр и тягайте оттуда по необходимости.
28 июн 12, 06:30    [12786242]     Ответить | Цитировать Сообщить модератору
 Re: Определить уникальность чего-либо на компьютере  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
-- серийник виндов использовать, я правда его на managed 2.0 C++ писал

#include "stdafx.h"

#include "Utils.h"

using namespace System;
using namespace System::Text;
using namespace Microsoft::Win32;


namespace Utils 
{
	static Byte ShuffleBytes( Byte bytes[] )
	{
		int nRet = 0;

		for(int nByte = 14; nByte >= 0; --nByte)
		{
			nRet = nRet << 8;
			Byte indx = bytes[nByte];
			nRet += indx;
			Byte rs = (Byte)(((__int64)nRet * 0x2AAAAAAB) >> 34);
			bytes[nByte] = rs;
			nRet = nRet % 24;
		}
		return nRet;
	}
	static void ProcessKey( Byte bytes[], array<Byte>^ szKey )
	{
		Byte szKeySymbols[] = "BCDFGHJKMPQRTVWXY2346789";
		int shift = 4;
		int pointer = 0;
		for( int nSymbol = sizeof(szKeySymbols)-1; ; --nSymbol )
		{
			Byte index = ShuffleBytes(bytes);
			szKey[pointer+nSymbol+shift] = szKeySymbols[ index ];
			if( 0 == nSymbol )
			{
				break;
			}
			if( 0 == nSymbol % 5 )
			{
				pointer-- ;
				szKey[pointer+nSymbol + shift] = '-';
			}
		}
	}
	String^ GetWindowsKey( const int nLen )
	{
		if (nLen < WINDOWS_KEY_LENGTH)
		{
		//	return ::SetLastError(ERROR_INSUFFICIENT_BUFFER), FALSE;
			return L"";
		}
		array<Byte>^ szKey = gcnew array<Byte>(30);
		Byte ptr[] = "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX\x0"; 
		for(int i = 0; i < szKey->Length; i++ )
		{
			szKey[i] = ptr[i]; 
		}
		
		String^		szKeyPath =  L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion";
		String^		szKeyName =  L"DigitalProductID";

		RegistryKey^ HKLM = Registry::LocalMachine;
		RegistryKey^ reg = HKLM->OpenSubKey( szKeyPath, false );

		String^ CurrentVersion = reg->GetValue(L"CurrentVersion")->ToString();
		String^ ProductName = reg->GetValue( L"ProductName" )->ToString();
		array<Byte>^ Bytes = (array<Byte>^)reg->GetValue( szKeyName );

		if( Bytes->Length )
		{
			Byte *pData = new Byte[ Bytes->Length ];
			for(int i = 0; i < Bytes->Length; i++ )
			{
				pData[i] = Bytes[i];
			}
			reg->Close();
			szKey[29] = L'\x0';
			ProcessKey( pData + 52, szKey );

			Encoding^ ascii = Encoding::ASCII;

			array<Char>^asciiChars = gcnew array<Char>(ascii->GetCharCount( szKey, 0, szKey->Length ));
		    ascii->GetChars( szKey, 0, szKey->Length, asciiChars, 0 );
			String^ asciiString = gcnew String( asciiChars );

			delete [] pData;
			return asciiString;
		}
		return L"";
	}
}
28 июн 12, 06:48    [12786250]     Ответить | Цитировать Сообщить модератору
 Re: Определить уникальность чего-либо на компьютере  [new]
aleks2
Guest
Lepsik
-- серийник виндов использовать

А оне у мя фсе одинаковые... Corporate Edition, панимаешь ли...
28 июн 12, 07:39    [12786276]     Ответить | Цитировать Сообщить модератору
 Re: Определить уникальность чего-либо на компьютере  [new]
Gold
Member

Откуда: Харьков
Сообщений: 2947
Спасибо всем откликнувшимся.
Действительно, ключ нужен для псевдозащиты от жидомассонского заговора. Реестр, пожалуй, подойдёт. Буду пробовать...
28 июн 12, 11:02    [12787280]     Ответить | Цитировать Сообщить модератору
 Re: Определить уникальность чего-либо на компьютере  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
ладно держи - отрываю от сердца. Два дня вечера потратил во время просмотра сериала Глухарь.

1. инсталяция - положить в BINN фолдер.

2. зарегистрировать

    USE MASTER
    GO
    sp_addextendedproc 'xp_DiskId', 'EpsDiskId.dll'
    go


3. использовать:
exec master..xp_DiskId


результат:

disk id model serial number hash of drive information

0 Maxtor 6L300R0 L6335HFG 4935207888661319327
1 WDC WD10EADS-00M2B0 WD-WCAV51548340 2424319558569305988
2 WDC WD10EAVS-00D7B1 WD-WCAU46189947 2606938069934380689
3 WDC WD20EARS-00MVWB0 WD-WCAZA6301810 -3528246010576773584
4 ST31000528AS 9VP07G80 2316721070316281990
5 WDC WD20EARS-00MVWB0 WD-WCAZA2933154 6944437904198336381
6 WDC WD10EADS-00L5B1 WD-WCAU4C700099 -358681974488035005


К сообщению приложен файл (EpsDiskId.zip - 145Kb) cкачать
29 июн 12, 08:27    [12792145]     Ответить | Цитировать Сообщить модератору
 Re: Определить уникальность чего-либо на компьютере  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
забыл добавить - тестировал для MSSQL2008R2x64

проект собирается для VS2010. В дотнет сборку тоже можно приспособить легко если CLI/C++ использовать
29 июн 12, 08:31    [12792154]     Ответить | Цитировать Сообщить модератору
 Re: Определить уникальность чего-либо на компьютере  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
DECLARE @Registry TABLE (Value SysName, Data NVarChar(4000));
INSERT @Registry EXEC sys.xp_Instance_RegRead N'HKEY_LOCAL_MACHINE', N'SOFTWARE\Microsoft\Cryptography', N'MachineGuid';
SELECT	Convert(UniqueIdentifier,Data) FROM @Registry;
И не надо мучаться, уже за нас всё продуманно.
29 июн 12, 12:10    [12793558]     Ответить | Цитировать Сообщить модератору
 Re: Определить уникальность чего-либо на компьютере  [new]
StKgn
Member

Откуда:
Сообщений: 63
В проекте есть попытка доступа к драйверу IDE21201.VXD
я так понимаю это не актуально на платформах NT и функцию ReadDrivePortsInWin9X можно исключить
29 июн 12, 14:23    [12794679]     Ответить | Цитировать Сообщить модератору
 Re: Определить уникальность чего-либо на компьютере  [new]
Gold
Member

Откуда: Харьков
Сообщений: 2947
Да я уже всё сделал с реестром. Честно говоря, значения WindowsDigitalProductId для победы над заговором более чем. Сам удивляюсь как это я не додумался реестр прочитать. :)
1 июл 12, 16:07    [12800614]     Ответить | Цитировать Сообщить модератору
 Re: Определить уникальность чего-либо на компьютере  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
+ Риторически
Gold
значения WindowsDigitalProductId для победы над заговором более чем
А зачем?
"Свой ласапед, со своими треугольными колёсами." Да?!
2 июл 12, 20:43    [12806483]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить