Написал небольшое приложения Код (Text): #include <windows.h> #include <tlhelp32.h> #include <stdio.h> typedef BOOL (WINAPI *WINSTATIONGETPROCESSSID)(HANDLE hServer, DWORD ProcessId, FILETIME ProcessStartTime, PBYTE pProcessUserSid, PDWORD dwSidSize); typedef void (WINAPI *CACHEDGETUSERFROMSID)(PSID pSid , PWCHAR pUserName, PULONG cbUserName); WINSTATIONGETPROCESSSID gpfnWinStationGetProcessSid=0; CACHEDGETUSERFROMSID gpfnCachedGetUserFromSid=0; DWORD GetProcessID(LPTSTR szProcessName) { HANDLE hSnapshot; PROCESSENTRY32 pe = {sizeof(pe)}; hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnapshot == INVALID_HANDLE_VALUE) return 0; if (!Process32First(hSnapshot, &pe)) return 0; do if(!lstrcmpi(pe.szExeFile,szProcessName)) return pe.th32ProcessID; while (Process32Next(hSnapshot, &pe)); return 0; } int main(int argc, char* argv[]) { PSID pUserSid = NULL; DWORD dwSize = 0; FILETIME pCreateTime ; DWORD PID; gpfnWinStationGetProcessSid = (WINSTATIONGETPROCESSSID)GetProcAddress(LoadLibrary("winsta.dll"), "WinStationGetProcessSid"); if (gpfnWinStationGetProcessSid==NULL) { printf("gpfnWinStationGetProcessSid==NULL"); exit(1); } gpfnCachedGetUserFromSid = (CACHEDGETUSERFROMSID)GetProcAddress(LoadLibrary("utildll.dll"), "CachedGetUserFromSid"); if (gpfnCachedGetUserFromSid==NULL) { printf("gpfnCachedGetUserFromSid==NULL"); exit(1); } PID=GetProcessID("explorer.exe"); if( !(*gpfnWinStationGetProcessSid)( NULL ,PID, pCreateTime,NULL, &dwSize )) { printf("!(*gpfnWinStationGetProcessSid)"); exit(1); } pUserSid =(PSID) new BYTE[ dwSize ]; if (pUserSid == NULL ) { printf("pUserSid == NULL"); delete pUserSid; exit(1); } if((*gpfnWinStationGetProcessSid)( NULL ,PID,pCreateTime,(PBYTE)pUserSid,&dwSize )) { if(!IsValidSid(pUserSid)) { printf("GetLastError()=%d",GetLastError()); delete pUserSid; exit(1); } } delete pUserSid; return 0; } Второй вызов WinStationGetProcessSid по логике должен вернить PSID но при провере на валидность GetLastError() показывает ERROR_INVALID_SID может кто сталкивался или объяснит почему; За ранее спасибо; OS W2k SP-автоматом ставятся
В смысле соединиться 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): DWORD SesID; if(ProcessIdToSessionId(PID,&SesID)==FALSE) { printf("GetLastError()=%d",GetLastError()); } if((*gpfnWinStationConnect)(NULL,SesID,LOGONID_CURRENT,L"",0)==FALSE) { printf("GetLastError()=%d",GetLastError()); } вылетает 1151 ERROR_APP_WRONG_OS в ХР 7045 //Доступ к требуемому сеансу отклонен. Получается 2000 не поддерживает коннект