Пытаюсь разобраться с WinStationGetProcessSid

Тема в разделе "LANGS.C", создана пользователем yurza, 19 фев 2009.

  1. yurza

    yurza New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2008
    Сообщения:
    69
    Написал небольшое приложения
    Код (Text):
    1. #include <windows.h>
    2. #include <tlhelp32.h>
    3. #include <stdio.h>
    4.  
    5.  
    6. typedef BOOL (WINAPI *WINSTATIONGETPROCESSSID)(HANDLE hServer, DWORD ProcessId,
    7.               FILETIME ProcessStartTime, PBYTE pProcessUserSid, PDWORD dwSidSize);
    8. typedef void (WINAPI *CACHEDGETUSERFROMSID)(PSID pSid , PWCHAR pUserName, PULONG cbUserName);
    9. WINSTATIONGETPROCESSSID gpfnWinStationGetProcessSid=0;
    10. CACHEDGETUSERFROMSID gpfnCachedGetUserFromSid=0;
    11.  
    12. DWORD GetProcessID(LPTSTR szProcessName)
    13. {
    14.     HANDLE hSnapshot;
    15.     PROCESSENTRY32 pe = {sizeof(pe)};
    16.  
    17.     hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    18.     if (hSnapshot == INVALID_HANDLE_VALUE)
    19.         return 0;
    20.  
    21.     if (!Process32First(hSnapshot, &pe))
    22.         return 0;
    23.  
    24.     do
    25.         if(!lstrcmpi(pe.szExeFile,szProcessName))
    26.             return pe.th32ProcessID;
    27.     while (Process32Next(hSnapshot, &pe));
    28.     return 0;
    29. }
    30. int main(int argc, char* argv[])
    31. {
    32. PSID pUserSid = NULL;
    33. DWORD dwSize = 0;
    34. FILETIME  pCreateTime ;
    35. DWORD PID;
    36. gpfnWinStationGetProcessSid = (WINSTATIONGETPROCESSSID)GetProcAddress(LoadLibrary("winsta.dll"), "WinStationGetProcessSid");
    37. if (gpfnWinStationGetProcessSid==NULL)
    38.     {
    39.     printf("gpfnWinStationGetProcessSid==NULL");
    40.     exit(1);
    41.     }
    42. gpfnCachedGetUserFromSid = (CACHEDGETUSERFROMSID)GetProcAddress(LoadLibrary("utildll.dll"), "CachedGetUserFromSid");
    43. if (gpfnCachedGetUserFromSid==NULL)
    44.   {
    45.   printf("gpfnCachedGetUserFromSid==NULL");
    46.   exit(1);
    47.   }
    48. PID=GetProcessID("explorer.exe");
    49. if( !(*gpfnWinStationGetProcessSid)( NULL ,PID, pCreateTime,NULL, &dwSize ))
    50.   {
    51.   printf("!(*gpfnWinStationGetProcessSid)");
    52.   exit(1);
    53.   }
    54. pUserSid =(PSID) new BYTE[ dwSize ];
    55. if (pUserSid == NULL )
    56. {
    57.  printf("pUserSid == NULL");
    58.  delete pUserSid;
    59.  exit(1);
    60. }
    61. if((*gpfnWinStationGetProcessSid)( NULL ,PID,pCreateTime,(PBYTE)pUserSid,&dwSize ))
    62.  {
    63.   if(!IsValidSid(pUserSid))
    64.   {
    65.    printf("GetLastError()=%d",GetLastError());
    66.    delete pUserSid;
    67.    exit(1);
    68.   }
    69.  }
    70. delete pUserSid;
    71.     return 0;
    72. }
    Второй вызов WinStationGetProcessSid по логике должен вернить PSID но при провере на валидность GetLastError() показывает ERROR_INVALID_SID
    может кто сталкивался или объяснит почему;
    За ранее спасибо;
    OS W2k SP-автоматом ставятся
     
  2. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Законнектится забыли?
     
  3. yurza

    yurza New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2008
    Сообщения:
    69
    В смысле соединиться
    BOOLEAN
    WINAPI
    WinStationConnectW(
    IN HANDLE hServer,
    IN ULONG ConnectSessionId,
    IN ULONG ActiveSessionId,
    IN PCWSTR Password,
    IN ULONG Unknown
    );
    IN HANDLE hServer как понял это на локальном NULL
    IN ULONG ConnectSessionId можно определить ProcessIdToSessionId
    а вот остальные параметры что то не нашел
    у китайцев гдето видел
    IN ULONG ActiveSessionId равный LOGONID_CURRENT
    а вот пароль что передать пароль моей сесии на компе чтоли
    и еще в 2000
    Код (Text):
    1. DWORD SesID;
    2. if(ProcessIdToSessionId(PID,&SesID)==FALSE)
    3.  {
    4.  printf("GetLastError()=%d",GetLastError());
    5.  }
    6.  
    7. if((*gpfnWinStationConnect)(NULL,SesID,LOGONID_CURRENT,L"",0)==FALSE)
    8.   {
    9.   printf("GetLastError()=%d",GetLastError());
    10.   }
    вылетает 1151 ERROR_APP_WRONG_OS
    в ХР 7045 //Доступ к требуемому сеансу отклонен.
    Получается 2000 не поддерживает коннект