SystemInfo.deviceUniqueIdentifier on Windows [РЕШЕНО]

Здесь можно задать свои вопросы напрямую разработчикам Unity3D

SystemInfo.deviceUniqueIdentifier on Windows [РЕШЕНО]

Сообщение [bm] 19 янв 2015, 11:32

Как работает SystemInfo.deviceUniqueIdentifier на Windows ? Из-за чего он может меняться раз в сутки?
Последний раз редактировалось [bm] 03 авг 2015, 08:54, всего редактировалось 1 раз.
Mafia Rush: universal iOS game _https://goo.gl/CKq4D Android _https://goo.gl/slFLXx
Shooter Ball: Android _https://goo.gl/21QyPw
skype: bmindfield
Аватара пользователя
[bm]
UNIверсал
 
Сообщения: 426
Зарегистрирован: 11 май 2010, 22:33
Откуда: Россия, Ижевск

Re: SystemInfo.deviceUniqueIdentifier on Windows

Сообщение gnoblin 06 апр 2015, 02:14

[bm] писал(а):Как работает SystemInfo.deviceUniqueIdentifier на Windows ? Из-за чего он может меняться раз в сутки?

и почему он одинаковый у кучи разных пользователей?
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: SystemInfo.deviceUniqueIdentifier on Windows

Сообщение [bm] 13 май 2015, 10:37

Выяснили что он меняется из-за вставленной флешки, что не есть гуд.
Mafia Rush: universal iOS game _https://goo.gl/CKq4D Android _https://goo.gl/slFLXx
Shooter Ball: Android _https://goo.gl/21QyPw
skype: bmindfield
Аватара пользователя
[bm]
UNIверсал
 
Сообщения: 426
Зарегистрирован: 11 май 2010, 22:33
Откуда: Россия, Ижевск

Re: SystemInfo.deviceUniqueIdentifier on Windows

Сообщение yyouyo 02 авг 2015, 10:17

А в 5 юньке проблема осталась с непостоянством значения?
yyouyo
UNец
 
Сообщения: 8
Зарегистрирован: 01 авг 2015, 20:48

Re: SystemInfo.deviceUniqueIdentifier on Windows

Сообщение [bm] 03 авг 2015, 08:54

Нашел выход. Просто брать GUID из реестра винды и скрещивать его с HWID видюхи, кол-во процессоров и памяти.

рабочий код:

Синтаксис:
Используется csharp
[DllImport("Advapi32.dll", EntryPoint = "RegOpenKeyExW", CharSet = CharSet.Unicode)]
static extern int RegOpenKeyEx(IntPtr hKey, [In] string lpSubKey, int ulOptions, int samDesired, out IntPtr phkResult);
[DllImport("Advapi32.dll", EntryPoint = "RegQueryValueExW", CharSet = CharSet.Unicode)]
static extern int RegQueryValueEx(IntPtr hKey, [In] string lpValueName, IntPtr lpReserved, out int lpType, [Out] byte[] lpData, ref int lpcbData);
[DllImport("advapi32.dll")]
static extern int RegCloseKey(IntPtr hKey);
               
static public readonly IntPtr HKEY_LOCAL_MACHINE = new IntPtr(-2147483646);
               
public const int KEY_READ = 0x20019;
public const int KEY_QUERY_VALUE = 0x0001;
public const int KEY_WOW64_64KEY = 0x0100;
public const int KEY_WOW64_32KEY = 0x0200;
               
public const int REG_NONE = 0;
public const int REG_SZ = 1;
public const int REG_EXPAND_SZ = 2;
public const int REG_BINARY = 3;
public const int REG_DWORD = 4;
public const int REG_DWORD_BIG_ENDIAN = 5;
public const int REG_LINK = 6;
public const int REG_MULTI_SZ = 7;
public const int REG_RESOURCE_LIST = 8;
public const int REG_FULL_RESOURCE_DESCRIPTOR = 9;
public const int REG_RESOURCE_REQUIREMENTS_LIST = 10;
public const int REG_QWORD = 11;

static string GetMachineGuid()
                {
                        IntPtr key;
                        int error;
                        if ((error = RegOpenKeyEx(HKEY_LOCAL_MACHINE, @"Software\Microsoft\Cryptography", 0, KEY_READ | KEY_WOW64_64KEY, out key)) != 0)
                                throw new Win32Exception(error);
                        try
                        {
                                return RegQueryValue(key, "MachineGuid").ToString();
                        }
                        finally
                        {
                                RegCloseKey(key);
                        }
                }

                static object RegQueryValue(IntPtr key, string value)
                {
                        return RegQueryValue(key, value, null);
                }
               
                static object RegQueryValue(IntPtr key, string value, object defaultValue)
                {
                        int error, type = 0, dataLength = 0xfde8;
                        int returnLength = dataLength;
                        byte[] data = new byte[dataLength];
                        while ((error = RegQueryValueEx(key, value, IntPtr.Zero, out type, data, ref returnLength)) == 0xea)
                        {
                                dataLength *= 2;
                                returnLength = dataLength;
                                data = new byte[dataLength];
                        }
                        if (error == 2)
                                return defaultValue; // value doesn't exist
                        if (error != 0)
                                throw new Win32Exception(error);
                       
                        switch (type)
                        {
                                case REG_NONE:
                                case REG_BINARY:
                                        return data;
                                case REG_DWORD:
                                        return (((data[0] | (data[1] << 8)) | (data[2] << 16)) | (data[3] << 24));
                                case REG_DWORD_BIG_ENDIAN:
                                        return (((data[3] | (data[2] << 8)) | (data[1] << 16)) | (data[0] << 24));
                                case REG_QWORD:
                                {
                                        uint numLow = (uint)(((data[0] | (data[1] << 8)) | (data[2] << 16)) | (data[3] << 24));
                                        uint numHigh = (uint)(((data[4] | (data[5] << 8)) | (data[6] << 16)) | (data[7] << 24));
                                        return (long)(((ulong)numHigh << 32) | (ulong)numLow);
                                }
                                case REG_SZ:
                                        return Encoding.Unicode.GetString(data, 0, returnLength);
                                case REG_EXPAND_SZ:
                                        return Environment.ExpandEnvironmentVariables(Encoding.Unicode.GetString(data, 0, returnLength));
                                case REG_MULTI_SZ:
                                {
                                        var strings = new List<string>();
                                        string packed = Encoding.Unicode.GetString(data, 0, returnLength);
                                        int start = 0;
                                        int end = packed.IndexOf('\0', start);
                                        while (end > start)
                                        {
                                                strings.Add(packed.Substring(start, end - start));
                                                start = end + 1;
                                                end = packed.IndexOf('\0', start);
                                        }
                                        return strings.ToArray();
                                }
                                default:
                                        throw new NotSupportedException();
                        }
                }
Последний раз редактировалось [bm] 04 авг 2015, 11:09, всего редактировалось 1 раз.
Mafia Rush: universal iOS game _https://goo.gl/CKq4D Android _https://goo.gl/slFLXx
Shooter Ball: Android _https://goo.gl/21QyPw
skype: bmindfield
Аватара пользователя
[bm]
UNIверсал
 
Сообщения: 426
Зарегистрирован: 11 май 2010, 22:33
Откуда: Россия, Ижевск

Re: SystemInfo.deviceUniqueIdentifier on Windows [РЕШЕНО]

Сообщение yyouyo 04 авг 2015, 09:59

А какой референс для кода?
yyouyo
UNец
 
Сообщения: 8
Зарегистрирован: 01 авг 2015, 20:48

Re: SystemInfo.deviceUniqueIdentifier on Windows [РЕШЕНО]

Сообщение yyouyo 04 авг 2015, 10:06

using Microsoft.Win32; не работает

The name `RegOpenKeyEx' does not exist in the current context
yyouyo
UNец
 
Сообщения: 8
Зарегистрирован: 01 авг 2015, 20:48

Re: SystemInfo.deviceUniqueIdentifier on Windows [РЕШЕНО]

Сообщение [bm] 04 авг 2015, 11:09

Извиняюсь, исправил пост. Проверено на Windows XP, 7 32/64
Mafia Rush: universal iOS game _https://goo.gl/CKq4D Android _https://goo.gl/slFLXx
Shooter Ball: Android _https://goo.gl/21QyPw
skype: bmindfield
Аватара пользователя
[bm]
UNIверсал
 
Сообщения: 426
Зарегистрирован: 11 май 2010, 22:33
Откуда: Россия, Ижевск

Re: SystemInfo.deviceUniqueIdentifier on Windows [РЕШЕНО]

Сообщение yyouyo 06 авг 2015, 15:50

[bm] писал(а):Извиняюсь, исправил пост. Проверено на Windows XP, 7 32/64


Спасибо большое! Всё работает!
yyouyo
UNец
 
Сообщения: 8
Зарегистрирован: 01 авг 2015, 20:48


Вернуться в Вопросы разработчикам движка

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1