Определение SID-не6 могу понять-на одном компе неверно

Тема в разделе "WASM.WIN32", создана пользователем coocky, 24 янв 2008.

  1. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Привет! Нужно узнать SID пользователя,для того ,что б попасть в ветку HKEY_USERS\sid_string_name\.......

    Делал уже разными способами-это один из них
    Код (Text):
    1. LPTSTR GetSID(LPTSTR pszName, LPTSTR pszBuffer)
    2. {
    3.     UNICODE_STRING szSID = { 0 };
    4.     WCHAR pszUserName[512] = L"";
    5.     DWORD lSizeOfSid = 512, lSizeOfDomain = 512;
    6.     LPVOID pSid = LocalAlloc(LMEM_ZEROINIT, lSizeOfSid);
    7.     SID_NAME_USE peUse;
    8.     WCHAR pszDomain[512] = L"";
    9.  
    10.         DWORD l = 512;
    11.         GetUserName(pszUserName, &l);
    12.    
    13.        BOOL i= LookupAccountName(NULL, pszUserName, (PSID) pSid, &lSizeOfSid, pszDomain, &lSizeOfDomain, &peUse);
    14.  
    15.     szSID.Buffer = (LPWSTR) LocalAlloc(LMEM_ZEROINIT, 512);
    16.     szSID.Length = 512; szSID.MaximumLength = szSID.Length + 2;
    17.  
    18.     pRtlConvertSidToUnicodeString=NULL;
    19.        
    20. reinterpret_cast<FARPROC&>(pRtlConvertSidToUnicodeString) = GetProcAddress(GetModuleHandle(TEXT("ntdll.dll")), "RtlConvertSidToUnicodeString");
    21.  
    22.     pRtlConvertSidToUnicodeString(&szSID, pSid, 0);
    23.  
    24.    lstrcpyn (pszBuffer, szSID.Buffer,szSID.Length );
    25.  
    26.     LocalFree(pSid);
    27.     LocalFree(szSID.Buffer);
    28.  
    29.     return pszBuffer;
    30. }
    Так вот,из 4_х компов sid совпадает с веткой реестра,а вот на одном нет значения,которое пишется обычно в конце -1003

    Т.е вместо S-1-5-21-1935655697-1682526488-682003330-1003 получаю S-1-5-21-1935655697-1682526488-682003330
    ну и естествено не могу туда попасть,ибо HKEY_USERS\S-1-5-21-1935655697-1682526488-682003330-1003 не существует

    Собствено вопрос-почему так может происходить,кто виноват и что делать?
     
  2. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Вот дали правильный код
    Код (Text):
    1. bool GetCurrentUserSid (char* pSidBuffer)
    2. {
    3.     if (! pSidBuffer) return false;
    4.  
    5.     bool r = false;
    6.     char name [512] = {0};
    7.     DWORD dwlen = 512;
    8.     PSID psid = NULL;
    9.     LPTSTR ssid = NULL;
    10.     char* prefdomain = NULL;
    11.     SID_NAME_USE siduse;
    12.     DWORD dwdom = 1024;
    13.     DWORD dwsid = 1024;
    14.  
    15.     psid = (char*) LocalAlloc (LPTR, 1024);
    16.     if (! psid) goto END;
    17.     prefdomain = (char*) LocalAlloc (LPTR, 1024);
    18.     if (! prefdomain) goto END;
    19.  
    20.     if (! GetUserNameEx (NameSamCompatible, name, &dwlen)) goto END;
    21.  
    22.     if (! LookupAccountName (
    23.         NULL,
    24.         name,
    25.         psid,
    26.         &dwsid,
    27.         prefdomain,
    28.         &dwdom,
    29.         &siduse))
    30.     {
    31.         goto END;
    32.     }
    33.  
    34.     if (! ConvertSidToStringSid (psid, &ssid)) goto END;
    35.  
    36.     lstrcpy (pSidBuffer, ssid);
    37.  
    38.     r = true;
    39.  
    40. END:
    41.  
    42.     if (psid) LocalFree (psid);
    43.     if (prefdomain) LocalFree (prefdomain);
    44.     if (ssid) LocalFree (ssid);
    45.  
    46.     return r;
    47. }