Создать процесс от имени пользователя 1 в среде пользователя 2. Vista+

Тема в разделе "WASM.WIN32", создана пользователем ziral2088, 24 авг 2010.

  1. ziral2088

    ziral2088 New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    283
    Рассматриваю только ОС Виста+. На ХП все то делается просто.
    Ситуация такова:
    Сессия 0: Система
    Сессия 1: Пользователь 1 Его пароля я не знаю и знать не должен.
    Сессия 2: Пользователь 2 Пароль этого пользователя узнать возможно.

    Нужно имея агента в сессии 0 и 1, запустить процесс в сессии 2 от имени пользователя 1.

    Для начала пробовал делать следующее(Запуская свой процесс с помощью psexec во второй сессии):
    1. WTSQueryUserToken( hUser1Token ) на 1 сессию.
    2. DuplicateTokenEx(hUser1Token ) или DuplicateHandle( hUser1Token ) для клонирования.
    3. SetTokenInformation( hUser1Token ) что бы сменить сессию на 2.
    4. CreateEnvironmentBlock( hUser1Token )
    5. ImpersonateLoggedOnUser( hUser1Token )
    6. CreateProcessAsUser( hUser1Token , "WinSta0\\Default")

    Процесс создавался но:
    1. Не имел хэндла на ALPC порты, и на "\Sessions\2\BaseNamedObjects".
    Из за этого функции CreateInstance пытаясь открыть BaseNamedObjects\__ComCasheCatalog(вроде так) падали с ACCESS_DENIED.
    [​IMG]

    Так же рождалось окно при старте процесса(Винда действительно не лицензионная на тестовой машине, но откуда оно появлялось при исполнении кода не ясно.):
    [​IMG]


    Пробовал и другие варианты. Смотрел как это делает runas(Там это делает svchost -> seclogon.dll -> SlrCreateProcessWithLogon), пробовал повторить, то есть:
    1. Использовал InitializeProcThreadAttributeList, UpdateProcThreadAttribute + EXTENDED_STARTUPINFO_PRESENT. Родительский процесс то менялся, но все равно процесс глючил и не имел "\Sessions\2\BaseNamedObjects".
    2. Job назначать не пробовал, но если пропустить назначение задачи(в виндбг изменил порядок выполнения в дллке seclogon.dll -> SlrCreateProcessWithLogon) то тот код все равно отрабатывает. То есть задания отношения к проблеме не имеют.

    Возможно кто то сталкивался с такой проблемой.
    П.С. Отрисовка у процесса идет вроде бы как нормально.
     
  2. freyr

    freyr New Member

    Публикаций:
    0
    Регистрация:
    23 фев 2010
    Сообщения:
    95
    самому не писал, но видел в зверях типа zeus 2.x реализацию запуска самого себя во все сессии. там получаются привелегии SeTcbPrivilege.
    WTSEnumerateSessions, WTSQueryUserToken, GetTokenInformation(TokenUser), CreateEnvironmentBlock CreateProcessAsUser, пишу по памяти, мб что-то пропустил.
     
  3. ziral2088

    ziral2088 New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    283
    freyr
    Самого себя запустить во всех сессиях от имени пользователей тех сессий, у меня тоже получается.

    Сейчас код может оформлю и выложу чуть позже, может где то очевидное упустил.

    Отредактировал: Добавил код. На XP работает чудесно, на Висте приложения становятся обрубками.

    Вот список хэндлов обычного блокнота:
    [​IMG]
    Вот список хэндлов блокнота запущеного через CreateProcessWithDifferentSessionRights.
    [​IMG]

    Код (Text):
    1. BOOL CreateProcessWithDifferentSessionRights( WCHAR* lpUserName , WCHAR* lpUserPass , WCHAR* lpDomain , WCHAR* lpCommandLine , ULONG iDestinationSession )
    2. {
    3.     BOOL                        rv = FALSE;
    4.     HANDLE                      hOriginalUserToken = FALSE;
    5.     HANDLE                      hNewSessionUserToken = FALSE;  
    6.     PSID                        SourceUserSid = NULL;
    7.     PSID                        LogonSid = NULL;
    8.     PSID                        LocalSid = NULL;
    9.     LUID                        LogonId;
    10.     LUID                        LogonLuid;
    11.     PTOKEN_GROUPS               PTokenGroups = NULL;   
    12.     USHORT                      cbUserName;
    13.     USHORT                      cbDomain;
    14.     USHORT                      cbPassword;
    15.     SID_IDENTIFIER_AUTHORITY    IdentifierAuthority = SECURITY_LOCAL_SID_AUTHORITY;
    16.     PVOID                       AuthInfoBuf = NULL;
    17.     ULONG                       AuthInfoSize;
    18.     PMSV1_0_INTERACTIVE_LOGON   pMsvAuthInfo;
    19.     LSA_STRING                  LsaString;
    20.     HANDLE                      hLsa = NULL;
    21.     DWORD                       dwTemp;
    22.     ULONG                       AuthenticationPackage;
    23.     TOKEN_SOURCE                SourceContext;
    24.     PVOID                       ProfileBuffer;
    25.     ULONG                       ProfileBufferLength;
    26.     HANDLE                      hNewUserToken = NULL;
    27.     QUOTA_LIMITS                Quotas;
    28.     NTSTATUS                    SubStatus;
    29.     PVOID                       pEnvironmentBlock = NULL;
    30.     STARTUPINFOW                si;
    31.     PROCESS_INFORMATION         pi;
    32.     BOOL                        bImpersonated = FALSE;
    33.     HDESK                       hDesktop            = NULL;
    34.     HDESK                       hOldDesktop         = NULL;
    35.     HWINSTA                     hWinSta             = NULL;
    36.     HWINSTA                     hOldWinSta          = NULL;
    37.  
    38.     #ifdef _DEBUG  
    39.         DbgMsg( __FILE__ , __LINE__ , "WTSGetActiveConsoleSessionId() = %d. iDestinationSession = %d. cmd = <%ls>\n" , WTSGetActiveConsoleSessionId( ) , iDestinationSession , lpCommandLine );
    40.     #endif
    41.  
    42.     if ( !WTSQueryUserToken( WTSGetActiveConsoleSessionId( ) , &hOriginalUserToken ) )
    43.     {
    44.         #ifdef _DEBUG  
    45.             DbgMsg( __FILE__ , __LINE__ , "WTSQueryUserToken fails.\n" );
    46.         #endif
    47.         goto end;
    48.     }
    49.  
    50.     if ( !ObtainSid( hOriginalUserToken , &SourceUserSid ) )
    51.     {
    52.         #ifdef _DEBUG  
    53.             DbgMsg( __FILE__ , __LINE__ , "GetLogonSID fails.\n" );
    54.         #endif
    55.         goto end;
    56.     }
    57.  
    58.     if ( !AllocateLocallyUniqueId( &LogonLuid ) )
    59.     {
    60.         #ifdef _DEBUG  
    61.             DbgMsg( __FILE__ , __LINE__ , "AllocateLocallyUniqueId fails.\n" );
    62.         #endif
    63.         goto end;
    64.     }
    65.  
    66.     #define TOKEN_GROUP_COUNT 3
    67.     PTokenGroups = (PTOKEN_GROUPS)HeapAlloc( GetProcessHeap( ) , 0 , sizeof(TOKEN_GROUPS) + TOKEN_GROUP_COUNT * sizeof(SID_AND_ATTRIBUTES));
    68.     if ( !PTokenGroups )
    69.     {
    70.         #ifdef _DEBUG  
    71.             DbgMsg( __FILE__ , __LINE__ , "HeapAlloc fails.\n" );
    72.         #endif
    73.         goto end;
    74.     }
    75.  
    76.     if ( !AllocateAndInitializeSid( &IdentifierAuthority , 3 ,  SECURITY_LOGON_IDS_RID , LogonLuid.HighPart , LogonLuid.LowPart , 0 , 0 , 0 , 0 , 0 , &LogonSid ) )
    77.     {
    78.         #ifdef _DEBUG  
    79.             DbgMsg( __FILE__ , __LINE__ , "AllocateAndInitializeSid fails.\n" );
    80.         #endif
    81.         goto end;
    82.     }
    83.     if ( !AllocateAndInitializeSid( &IdentifierAuthority , 1 , SECURITY_LOCAL_RID , 0 , 0 , 0 , 0 , 0 , 0 , 0 , &LocalSid ) )
    84.     {
    85.         #ifdef _DEBUG  
    86.             DbgMsg( __FILE__ , __LINE__ , "AllocateAndInitializeSid fails.\n" );
    87.         #endif
    88.         goto end;
    89.     }
    90.  
    91.     PTokenGroups->GroupCount = TOKEN_GROUP_COUNT;
    92.  
    93.     PTokenGroups->Groups[0].Sid = LogonSid;
    94.     PTokenGroups->Groups[0].Attributes = SE_GROUP_MANDATORY | SE_GROUP_ENABLED | SE_GROUP_ENABLED_BY_DEFAULT | SE_GROUP_LOGON_ID;
    95.  
    96.     PTokenGroups->Groups[1].Sid = LocalSid;
    97.     PTokenGroups->Groups[1].Attributes = SE_GROUP_MANDATORY | SE_GROUP_ENABLED | SE_GROUP_ENABLED_BY_DEFAULT;
    98.  
    99.     PTokenGroups->Groups[2].Sid = SourceUserSid;
    100.     PTokenGroups->Groups[2].Attributes = SE_GROUP_MANDATORY | SE_GROUP_ENABLED | SE_GROUP_ENABLED_BY_DEFAULT;
    101.  
    102.     cbUserName = (USHORT)(lstrlenW(lpUserName) * sizeof(WCHAR));
    103.     cbDomain = (USHORT)(lstrlenW(lpDomain) * sizeof(WCHAR));
    104.     cbPassword = (USHORT)(lstrlenW(lpUserPass) * sizeof(WCHAR));
    105.  
    106.     AuthInfoSize = sizeof(MSV1_0_INTERACTIVE_LOGON) + cbUserName + sizeof(WCHAR) + cbDomain + sizeof(WCHAR) + cbPassword + sizeof(WCHAR);
    107.     AuthInfoBuf = HeapAlloc( GetProcessHeap() , HEAP_ZERO_MEMORY , AuthInfoSize );
    108.     if ( !AuthInfoBuf )
    109.     {
    110.         #ifdef _DEBUG  
    111.             DbgMsg( __FILE__ , __LINE__ , "HeapAlloc fails.\n" );
    112.         #endif 
    113.         goto end;
    114.     }
    115.     pMsvAuthInfo = (PMSV1_0_INTERACTIVE_LOGON)AuthInfoBuf;
    116.     pMsvAuthInfo->MessageType = MsV1_0InteractiveLogon;
    117.     pMsvAuthInfo->UserName.Length = cbUserName;
    118.     pMsvAuthInfo->UserName.MaximumLength = cbUserName + sizeof(WCHAR);
    119.     pMsvAuthInfo->UserName.Buffer = (PWSTR)(pMsvAuthInfo + 1);
    120.     lstrcpyW(pMsvAuthInfo->UserName.Buffer, lpUserName);
    121.     pMsvAuthInfo->LogonDomainName.Length = cbDomain;
    122.     pMsvAuthInfo->LogonDomainName.MaximumLength = cbDomain + sizeof(WCHAR);
    123.     pMsvAuthInfo->LogonDomainName.Buffer = (PWSTR)((PBYTE)(pMsvAuthInfo->UserName.Buffer) + pMsvAuthInfo->UserName.MaximumLength);
    124.     lstrcpyW(pMsvAuthInfo->LogonDomainName.Buffer, lpDomain);
    125.     pMsvAuthInfo->Password.Length = cbPassword;
    126.     pMsvAuthInfo->Password.MaximumLength = cbPassword + sizeof(WCHAR);
    127.     pMsvAuthInfo->Password.Buffer = (PWSTR)((PBYTE)(pMsvAuthInfo->LogonDomainName.Buffer) + pMsvAuthInfo->LogonDomainName.MaximumLength);
    128.     lstrcpyW(pMsvAuthInfo->Password.Buffer, lpUserPass);
    129.  
    130.     LsaString.Buffer = "User32LogonProcess";
    131.     LsaString.Length = lstrlenA( LsaString.Buffer );
    132.     LsaString.MaximumLength = LsaString.Length + 1;
    133.     if ( LsaRegisterLogonProcess( &LsaString , &hLsa , &dwTemp ) )
    134.     {
    135.         #ifdef _DEBUG  
    136.             DbgMsg( __FILE__ , __LINE__ , "LsaRegisterLogonProcess fails.\n" );
    137.         #endif 
    138.         goto end;
    139.     }
    140.  
    141.     LsaString.Buffer = "MICROSOFT_AUTHENTICATION_PACKAGE_V1_0";
    142.     LsaString.Length = lstrlenA( LsaString.Buffer );
    143.     LsaString.MaximumLength = LsaString.Length + 1;
    144.     if ( LsaLookupAuthenticationPackage( hLsa , &LsaString , &AuthenticationPackage ) )
    145.     {
    146.         #ifdef _DEBUG  
    147.             DbgMsg( __FILE__ , __LINE__ , "LsaLookupAuthenticationPackage fails.\n" );
    148.         #endif 
    149.         goto end;
    150.     }
    151.  
    152.     LsaString.Buffer = "TTY1";
    153.     LsaString.Length = lstrlenA( LsaString.Buffer );
    154.     LsaString.MaximumLength = LsaString.Length + 1;
    155.  
    156.     lstrcpyA( SourceContext.SourceName , "Source" );
    157.     if ( !AllocateLocallyUniqueId( &SourceContext.SourceIdentifier ) )
    158.     {
    159.         #ifdef _DEBUG  
    160.             DbgMsg( __FILE__ , __LINE__ , "AllocateLocallyUniqueId fails.\n" );
    161.         #endif 
    162.         goto end;
    163.     }
    164.  
    165.     if ( LsaLogonUser( hLsa , &LsaString , Interactive , AuthenticationPackage , AuthInfoBuf , AuthInfoSize , PTokenGroups , &SourceContext ,
    166.                         &ProfileBuffer , &ProfileBufferLength , &LogonId , &hNewUserToken , &Quotas , &SubStatus ) )
    167.     {
    168.         #ifdef _DEBUG  
    169.             DbgMsg( __FILE__ , __LINE__ , "LsaLogonUser fails.\n" );
    170.         #endif 
    171.         goto end;
    172.     }
    173.  
    174.     if ( !DuplicateTokenEx( hOriginalUserToken , TOKEN_WRITE | TOKEN_ADJUST_SESSIONID | TOKEN_QUERY | TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY | TOKEN_IMPERSONATE , NULL , SecurityAnonymous , TokenPrimary , &hNewSessionUserToken ) )
    175.     {
    176.         #ifdef _DEBUG  
    177.             DbgMsg( __FILE__ , __LINE__ , "DuplicateHandleEx fails.\n" );
    178.         #endif 
    179.         goto end;    
    180.     }
    181.  
    182.     if ( !SetTokenInformation( hNewSessionUserToken , TokenSessionId , (LPVOID)&iDestinationSession , sizeof(iDestinationSession) ) )
    183.     {
    184.         #ifdef _DEBUG  
    185.             DbgMsg( __FILE__ , __LINE__ , "SetTokenInformation fails.\n" );
    186.         #endif 
    187.         goto end;    
    188.     }
    189.  
    190.     if ( !CreateEnvironmentBlock( &pEnvironmentBlock , hNewSessionUserToken , FALSE ) )
    191.     {
    192.         #ifdef _DEBUG  
    193.             DbgMsg( __FILE__ , __LINE__ , "CreateEnvironmentBlock fails.\n" );
    194.         #endif 
    195.         goto end;
    196.     }
    197.  
    198.     hOldWinSta = GetProcessWindowStation( );
    199.     hOldDesktop = GetThreadDesktop( GetCurrentThreadId( ) );
    200.  
    201.     hWinSta = OpenWindowStation( _T("WinSta0") , FALSE , MAXIMUM_ALLOWED );
    202.     if ( !hWinSta )
    203.     {
    204.         #ifdef _DEBUG  
    205.             DbgMsg( __FILE__ , __LINE__ , "OpenWindowStation fails.\n" );
    206.         #endif 
    207.         goto end;
    208.     }
    209.     if ( !SetProcessWindowStation( hWinSta ) )
    210.     {
    211.         #ifdef _DEBUG  
    212.             DbgMsg( __FILE__ , __LINE__ , "SetProcessWindowStation fails.\n" );
    213.         #endif 
    214.         goto end;
    215.     }
    216.  
    217.     hDesktop = OpenDesktop( _T("Default") , 0 , FALSE , MAXIMUM_ALLOWED );
    218.     if ( !hDesktop )
    219.     {
    220.         #ifdef _DEBUG  
    221.             DbgMsg( __FILE__ , __LINE__ , "OpenDesktop fails.\n" );
    222.         #endif 
    223.         goto end;
    224.     }
    225.     if ( !SetThreadDesktop( hDesktop ) )
    226.     {
    227.         #ifdef _DEBUG  
    228.             DbgMsg( __FILE__ , __LINE__ , "SetThreadDesktop fails.\n" );
    229.         #endif 
    230.         goto end;
    231.     }
    232.  
    233.     if ( !AddTheAceWindowStation( hWinSta , SourceUserSid ) )
    234.     {
    235.         #ifdef _DEBUG  
    236.             DbgMsg( __FILE__ , __LINE__ , "AddTheAceWindowStation fails.\n" );
    237.         #endif 
    238.         goto end;
    239.     }
    240.     if ( !AddTheAceDesktop( hDesktop , SourceUserSid ) )
    241.     {  
    242.         #ifdef _DEBUG  
    243.             DbgMsg( __FILE__ , __LINE__ , "AddTheAceDesktop fails.\n" );
    244.         #endif 
    245.         goto end;
    246.     }
    247.    
    248.     if ( !ImpersonateLoggedOnUser( hNewSessionUserToken ) )
    249.     {
    250.         #ifdef _DEBUG  
    251.             DbgMsg( __FILE__ , __LINE__ , "ImpersonateLoggedOnUser fails.\n" );
    252.         #endif 
    253.         goto end;
    254.     }
    255.     bImpersonated = TRUE;
    256.            
    257.     SecureZeroMemory( &si , sizeof( si ) );
    258.     si.cb = sizeof( si );
    259.     si.lpDesktop = L"WinSta0\\Default";
    260.  
    261.     if ( !CreateProcessAsUserW( hNewSessionUserToken , NULL , lpCommandLine , NULL , NULL , FALSE , CREATE_UNICODE_ENVIRONMENT , pEnvironmentBlock , NULL , &si , &pi ) )
    262.     {
    263.         #ifdef _DEBUG  
    264.             DbgMsg( __FILE__ , __LINE__ , "CreateProcessAsUserW fails.\n" );
    265.         #endif 
    266.         goto end;
    267.     }
    268.  
    269.     CloseHandle( pi.hProcess );
    270.     CloseHandle( pi.hThread );
    271.  
    272.     rv = TRUE;
    273. end:
    274.     if ( bImpersonated )
    275.         RevertToSelf( );
    276.  
    277.     if ( SourceUserSid != NULL )
    278.         HeapFree( GetProcessHeap( ) , 0 , SourceUserSid );
    279.  
    280.     if ( PTokenGroups != NULL )
    281.         HeapFree( GetProcessHeap( ) , 0 , PTokenGroups );
    282.  
    283.     if ( LogonSid != NULL )
    284.         FreeSid( LogonSid );
    285.  
    286.     if ( LocalSid != NULL )
    287.         FreeSid( LocalSid );
    288.  
    289.     if ( AuthInfoBuf != NULL )
    290.         HeapFree( GetProcessHeap( ) , 0 , AuthInfoBuf );
    291.  
    292.     if ( hLsa != NULL )
    293.         LsaDeregisterLogonProcess( hLsa );
    294.  
    295.     if ( pEnvironmentBlock != NULL )
    296.         DestroyEnvironmentBlock( pEnvironmentBlock );
    297.  
    298.     if ( hNewUserToken != NULL )
    299.         CloseHandle( hNewUserToken );
    300.  
    301.     if ( hOriginalUserToken != NULL )
    302.         CloseHandle( hOriginalUserToken );
    303.  
    304.     if ( hNewSessionUserToken != NULL )
    305.         CloseHandle( hNewSessionUserToken );
    306.        
    307.     if ( hDesktop != NULL )
    308.         CloseDesktop( hDesktop );
    309.  
    310.     if ( hWinSta != NULL )
    311.         CloseWindowStation( hWinSta );
    312.  
    313.     if ( hOldDesktop != NULL )
    314.         SetThreadDesktop( hOldDesktop );
    315.  
    316.     if ( hOldWinSta != NULL )
    317.         SetProcessWindowStation( hOldWinSta );
    318.  
    319.     return rv;
    320. }
     
  4. ziral2088

    ziral2088 New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    283
    Нашел причину. В исходном коде что я привел, LsaLogonUser вообще юзать не нужно, вместо этого нужно создать токен через NtCreateToken с группами пользователя 1 и 2. И тогда на новом токене уже создавать процесс. (Никакие SetThreadDesktop и AddTheAceWindowStation тогда тоже не нужны).

    Надеюсь скоро освободиться от работы и чиркнуть статью по этому поводу(на тему: наши друзья токены), думаю многим будет интересно.
     
  5. ziral2088

    ziral2088 New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    283
    Так видно все таки я еще что то упустил.
    Работают все процессы кроме iexplore.exe.(то есть калькулятор,блокнот, обычный експлорер(приятно сидеть в рабочей среде другого пользователя), опера и остальные браузеры и программы).
    Вернее iexplorer тоже работает но его дочерний процесс сразу завершаеться(в итоге висит только родительский, но он то ничего не рисует, кроме диалого: восстановить предыдущую сессию)
    Вот код, все равно я потом его намерен как и саму утилиту выложить в сорцы\статью, так что скрывать нечего.
    Кто знает посмотрите, что я упустил.(6 Експлорер работает, не работает только 8 на 7 еще не тестил)

    Код (Text):
    1. BOOL ExecuteProcessInSession( WCHAR* lpCommandLine , ULONG iSourceSession , ULONG iDestinationSession )
    2. {
    3.     HANDLE                      hSourceSessionUserHandle = NULL;
    4.     HANDLE                      hDestinationSessionUserHandle = NULL;
    5.     HANDLE                      hNewUsersToken = NULL;
    6.     PSID                        DestinationSessionUserSid = NULL;
    7.     PSID                        SourceSessionUserSid = NULL;
    8.     PSID                        NewUsersSid = NULL;
    9.     NTSTATUS                    ntStatus;
    10.     SECURITY_QUALITY_OF_SERVICE sqos = { sizeof sqos , SecurityAnonymous , SECURITY_STATIC_TRACKING , FALSE };
    11.     OBJECT_ATTRIBUTES           oa = { sizeof oa , 0 , 0 , 0 , 0 , &sqos };
    12.     LUID                        authid = SYSTEM_LUID;
    13.     LUID                        luid;
    14.     PTOKEN_STATISTICS           pTokenStatistics = NULL;
    15.     PTOKEN_GROUPS               pTokenGroups = NULL;   
    16.     PTOKEN_PRIVILEGES           pTokenPrivileges = NULL;
    17.     PTOKEN_OWNER                pTokenOwner = NULL;
    18.     PTOKEN_PRIMARY_GROUP        pTokenPrimaryGroup = NULL;
    19.     PTOKEN_DEFAULT_DACL         pTokenDefaultDacl = NULL;
    20.     TOKEN_SOURCE                source;        
    21.     TOKEN_USER                  TokenUser; 
    22.     BOOL                        bImpersonated = FALSE;
    23.     TCHAR                       UserName[MAX_PATH];
    24.     DWORD                       dwSizeofUserName;
    25.     PVOID                       pEnvironmentBlock = NULL;
    26.     STARTUPINFOW                si;
    27.     PROCESS_INFORMATION         pi;
    28.     BOOL                        rv = FALSE;
    29.     /*HDESK                     hDesktop            = NULL;
    30.     HDESK                       hOldDesktop         = NULL;
    31.     HWINSTA                     hWinSta             = NULL;
    32.     HWINSTA                     hOldWinSta          = NULL;*/
    33.  
    34.     if ( !WTSQueryUserToken ( iSourceSession , &hSourceSessionUserHandle ) )
    35.     {
    36.         #ifdef _DEBUG  
    37.             DbgMsg( __FILE__ , __LINE__ , "WTSQueryUserToken(iSourceSession) fails.\n" );
    38.         #endif
    39.         goto end;
    40.     }
    41.  
    42.     if ( !ImpersonateLoggedOnUser( hSourceSessionUserHandle ) )
    43.     {
    44.         #ifdef _DEBUG  
    45.             DbgMsg( __FILE__ , __LINE__ , "ImpersonateLoggedOnUser fails.\n" );
    46.         #endif
    47.         goto end;
    48.     }
    49.     bImpersonated = TRUE;
    50.  
    51.     dwSizeofUserName = sizeof( UserName );
    52.     if ( !GetUserName( UserName , &dwSizeofUserName ) )
    53.     {
    54.         #ifdef _DEBUG  
    55.             DbgMsg( __FILE__ , __LINE__ , "GetUserName fails.\n" );
    56.         #endif
    57.         goto end;
    58.     }
    59.  
    60.     RevertToSelf( );
    61.     bImpersonated = FALSE;
    62.  
    63.     SourceSessionUserSid = Name2SID( UserName , NULL );
    64.     if ( !SourceSessionUserSid )
    65.     {
    66.         #ifdef _DEBUG  
    67.             DbgMsg( __FILE__ , __LINE__ , "Name2SID fails.\n" );
    68.         #endif
    69.         goto end;
    70.     }
    71.  
    72.     if ( !WTSQueryUserToken ( iDestinationSession , &hDestinationSessionUserHandle ) )
    73.     {
    74.         #ifdef _DEBUG  
    75.             DbgMsg( __FILE__ , __LINE__ , "WTSQueryUserToken(iDestinationSession) fails.\n" );
    76.         #endif
    77.         goto end;
    78.     }
    79.        
    80.     if ( !ObtainSid( hDestinationSessionUserHandle , &DestinationSessionUserSid ) )
    81.     {
    82.         #ifdef _DEBUG  
    83.             DbgMsg( __FILE__ , __LINE__ , "ObtainSid fails.\n" );
    84.         #endif
    85.         goto end;
    86.     }  
    87.  
    88.     if ( !AllocateLocallyUniqueId( &luid ) )
    89.     {
    90.         #ifdef _DEBUG  
    91.             DbgMsg( __FILE__ , __LINE__ , "Name2SID fails.\n" );
    92.         #endif
    93.         goto end;
    94.     }
    95.  
    96.     pTokenStatistics = PTOKEN_STATISTICS( GetFromToken( hSourceSessionUserHandle , TokenStatistics ) );
    97.     if ( !pTokenStatistics )
    98.     {
    99.         #ifdef _DEBUG  
    100.             DbgMsg( __FILE__ , __LINE__ , "GetFromToken(TokenStatistics) fails.\n" );
    101.         #endif
    102.         goto end;
    103.     }
    104.  
    105.     pTokenGroups = PTOKEN_GROUPS( GetFromToken( hSourceSessionUserHandle , TokenGroups ) );
    106.     if ( !pTokenGroups )
    107.     {
    108.         #ifdef _DEBUG  
    109.             DbgMsg( __FILE__ , __LINE__ , "GetFromToken(TokenGroups) fails.\n" );
    110.         #endif
    111.         goto end;
    112.     }
    113.  
    114.     {
    115.         PTOKEN_GROUPS pTempTokenGroups = (PTOKEN_GROUPS)HeapAlloc( GetProcessHeap( ) , 0 , sizeof(TOKEN_GROUPS) + ( pTokenGroups->GroupCount + 1 ) * sizeof( SID_AND_ATTRIBUTES ) );
    116.         if ( pTempTokenGroups == NULL )
    117.         {
    118.             #ifdef _DEBUG  
    119.                 DbgMsg( __FILE__ , __LINE__ , "HeapAlloc fails.\n" );
    120.             #endif
    121.             goto end;
    122.         }
    123.  
    124.         pTempTokenGroups->GroupCount = pTokenGroups->GroupCount + 1 ;
    125.  
    126.         for ( ULONG i = 0 ; i < pTokenGroups->GroupCount ; i++ )
    127.         {
    128.             pTempTokenGroups->Groups[i].Attributes = pTokenGroups->Groups[i].Attributes;
    129.             pTempTokenGroups->Groups[i].Sid = pTokenGroups->Groups[i].Sid;
    130.         }
    131.  
    132.         pTempTokenGroups->Groups[pTempTokenGroups->GroupCount - 1].Sid = DestinationSessionUserSid;
    133.         pTempTokenGroups->Groups[pTempTokenGroups->GroupCount - 1].Attributes = SE_GROUP_MANDATORY | SE_GROUP_ENABLED | SE_GROUP_ENABLED_BY_DEFAULT;
    134.  
    135.         HeapFree( GetProcessHeap( ) , 0 , pTokenGroups );
    136.         pTokenGroups = pTempTokenGroups;
    137.     }
    138.     pTokenPrivileges = PTOKEN_PRIVILEGES( GetFromToken( hSourceSessionUserHandle , TokenPrivileges ) );
    139.     if ( !pTokenPrivileges )
    140.     {
    141.         #ifdef _DEBUG  
    142.             DbgMsg( __FILE__ , __LINE__ , "GetFromToken(TokenPrivileges) fails.\n" );
    143.         #endif
    144.         goto end;
    145.     }
    146.  
    147.     pTokenOwner = NULL;
    148.  
    149.     pTokenPrimaryGroup = PTOKEN_PRIMARY_GROUP( GetFromToken( hSourceSessionUserHandle , TokenPrimaryGroup ) );
    150.     if ( !pTokenPrimaryGroup )
    151.     {
    152.         #ifdef _DEBUG  
    153.             DbgMsg( __FILE__ , __LINE__ , "GetFromToken(TokenPrimaryGroup) fails.\n" );
    154.         #endif
    155.         goto end;
    156.     }
    157.  
    158.     pTokenDefaultDacl = NULL;
    159.  
    160.     RtlCopyMemory( source.SourceName , "*SYSTEM*" , 8 );
    161.     source.SourceIdentifier.LowPart = luid.LowPart;
    162.     source.SourceIdentifier.HighPart = luid.HighPart;
    163.  
    164.     TokenUser.User.Sid = SourceSessionUserSid;
    165.     TokenUser.User.Attributes = 0;
    166.  
    167.     ntStatus = NtCreateToken( &hNewUsersToken , TOKEN_ALL_ACCESS , &oa , TokenPrimary , PLUID( &authid ) , PLARGE_INTEGER( &pTokenStatistics->ExpirationTime ) , &TokenUser , pTokenGroups ,
    168.                         pTokenPrivileges , pTokenOwner , pTokenPrimaryGroup , pTokenDefaultDacl , &source );
    169.     if ( ntStatus )
    170.     {
    171.         #ifdef _DEBUG  
    172.             DbgMsg( __FILE__ , __LINE__ , "NtCreateToken fails with status 0x%X.\n" , ntStatus );
    173.         #endif
    174.         goto end;
    175.     }
    176.  
    177.     if ( !SetTokenInformation( hNewUsersToken , TokenSessionId , (LPVOID)&iDestinationSession , sizeof(iDestinationSession) ) )
    178.     {
    179.         #ifdef _DEBUG  
    180.             DbgMsg( __FILE__ , __LINE__ , "SetTokenInformation fails.\n" );
    181.         #endif 
    182.         goto end;    
    183.     }
    184.  
    185.     if ( !CreateEnvironmentBlock( &pEnvironmentBlock , hSourceSessionUserHandle , FALSE ) )
    186.     {
    187.         #ifdef _DEBUG  
    188.             DbgMsg( __FILE__ , __LINE__ , "CreateEnvironmentBlock fails.\n" );
    189.         #endif 
    190.         goto end;
    191.     }
    192.  
    193.     SecureZeroMemory( &si , sizeof( si ) );
    194.     si.cb = sizeof( si );
    195.     si.lpDesktop = L"WinSta0\\Default";
    196.  
    197.     /*
    198.  
    199.     if ( !ObtainSid( hSourceSessionUserHandle , &NewUsersSid ) )//change hSourceSessionUserHandle != NewUsersSid
    200.     {
    201.         #ifdef _DEBUG  
    202.             DbgMsg( __FILE__ , __LINE__ , "ObtainSid fails.\n" );
    203.         #endif
    204.         goto end;
    205.     }
    206.  
    207.     hOldWinSta = GetProcessWindowStation( );
    208.     hOldDesktop = GetThreadDesktop( GetCurrentThreadId( ) );
    209.     hWinSta = OpenWindowStation( _T("WinSta0") , FALSE , MAXIMUM_ALLOWED );
    210.     if ( !hWinSta )
    211.     {
    212.         #ifdef _DEBUG  
    213.             DbgMsg( __FILE__ , __LINE__ , "OpenWindowStation fails.\n" );
    214.         #endif 
    215.         goto end;
    216.     }
    217.     if ( !SetProcessWindowStation( hWinSta ) )
    218.     {
    219.         #ifdef _DEBUG  
    220.             DbgMsg( __FILE__ , __LINE__ , "SetProcessWindowStation fails.\n" );
    221.         #endif 
    222.         goto end;
    223.     }
    224.  
    225.     hDesktop = OpenDesktop( _T("Default") , 0 , FALSE , MAXIMUM_ALLOWED );
    226.     if ( !hDesktop )
    227.     {
    228.         #ifdef _DEBUG  
    229.             DbgMsg( __FILE__ , __LINE__ , "OpenDesktop fails.\n" );
    230.         #endif 
    231.         goto end;
    232.     }
    233.     if ( !SetThreadDesktop( hDesktop ) )
    234.     {
    235.         #ifdef _DEBUG  
    236.             DbgMsg( __FILE__ , __LINE__ , "SetThreadDesktop fails.\n" );
    237.         #endif 
    238.         goto end;
    239.     }
    240.  
    241.     if ( !AddTheAceWindowStation( hWinSta , NewUsersSid ) )
    242.     {
    243.         #ifdef _DEBUG  
    244.             DbgMsg( __FILE__ , __LINE__ , "AddTheAceWindowStation fails.\n" );
    245.         #endif 
    246.         goto end;
    247.     }
    248.     if ( !AddTheAceDesktop( hDesktop , NewUsersSid ) )
    249.     {  
    250.         #ifdef _DEBUG  
    251.             DbgMsg( __FILE__ , __LINE__ , "AddTheAceDesktop fails.\n" );
    252.         #endif 
    253.         goto end;
    254.     }
    255.  
    256.     if ( !ImpersonateLoggedOnUser( hDestinationSessionUserHandle ) )
    257.     {
    258.         #ifdef _DEBUG  
    259.             DbgMsg( __FILE__ , __LINE__ , "ImpersonateLoggedOnUser fails.\n" );
    260.         #endif 
    261.         goto end;
    262.     }
    263.     bImpersonated = TRUE;
    264. */
    265.  
    266.     if ( !CreateProcessAsUserW( hNewUsersToken , NULL , lpCommandLine , NULL , NULL , FALSE , CREATE_UNICODE_ENVIRONMENT + CREATE_NEW_PROCESS_GROUP , pEnvironmentBlock , NULL , &si , &pi ) )
    267.     {
    268.         #ifdef _DEBUG  
    269.             DbgMsg( __FILE__ , __LINE__ , "CreateProcessAsUserW fails.\n" );
    270.         #endif 
    271.         goto end;
    272.     }
    273.  
    274.     rv = TRUE;
    275.  
    276.     CloseHandle( pi.hProcess );
    277.     CloseHandle( pi.hThread );
    278. end:
    279.     if ( bImpersonated )
    280.         RevertToSelf( );
    281.  
    282.     if ( hSourceSessionUserHandle )
    283.         CloseHandle( hSourceSessionUserHandle );
    284.  
    285.     if ( hDestinationSessionUserHandle )
    286.         CloseHandle( hDestinationSessionUserHandle );
    287.  
    288.     if ( hNewUsersToken )
    289.         CloseHandle( hNewUsersToken );
    290.  
    291.     if ( DestinationSessionUserSid != NULL )
    292.         HeapFree( GetProcessHeap( ) , 0 , DestinationSessionUserSid );
    293.  
    294.     if ( SourceSessionUserSid != NULL )
    295.         LocalFree( SourceSessionUserSid );
    296.  
    297.     if ( pTokenStatistics )
    298.         HeapFree( GetProcessHeap( ) , 0 , pTokenStatistics );
    299.  
    300.     if ( pTokenGroups )
    301.         HeapFree( GetProcessHeap( ) , 0 , pTokenGroups );
    302.  
    303.     if ( pTokenPrivileges )
    304.         HeapFree( GetProcessHeap( ) , 0 , pTokenPrivileges );
    305.  
    306.     if ( pTokenOwner )
    307.         HeapFree( GetProcessHeap( ) , 0 , pTokenOwner );
    308.  
    309.     if ( pTokenPrimaryGroup )
    310.         HeapFree( GetProcessHeap( ) , 0 , pTokenPrimaryGroup );
    311.  
    312.     if ( pTokenDefaultDacl )
    313.         HeapFree( GetProcessHeap( ) , 0 , pTokenDefaultDacl );
    314.  
    315.     if ( pEnvironmentBlock != NULL )
    316.         DestroyEnvironmentBlock( pEnvironmentBlock );
    317.  
    318.     /*if ( hDesktop != NULL )
    319.         CloseDesktop( hDesktop );
    320.  
    321.     if ( hWinSta != NULL )
    322.         CloseWindowStation( hWinSta );
    323.  
    324.     if ( hOldDesktop != NULL )
    325.         SetThreadDesktop( hOldDesktop );
    326.  
    327.     if ( hOldWinSta != NULL )
    328.         SetProcessWindowStation( hOldWinSta );*/
    329.  
    330.     return rv;
    331. }
     
  6. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    ОФФТОП: вот это просто жуть:
    сделай как-нить так:
    Код (Text):
    1. // в хедере каком-нить
    2. #ifdef _DEBUG
    3. #define  DBGMSG(String) DbgMsg( __FILE__ , __LINE__ , String "\n" )
    4. #else
    5. #define DBGMSG(String)
    6. #endif
    7. // вызов из кода:
    8. DBGMSG("CreateProcessAsUserW fails.");
    культура кода так сказать)))
     
  7. freyr

    freyr New Member

    Публикаций:
    0
    Регистрация:
    23 фев 2010
    Сообщения:
    95
    если ие7 работает нормально нужно копать в сторону protected mode введенного в ие8. там 2ой процесс запускается хитро(это все начиная с висты, опять же, на сколько помню), не могу найти ссылку, попадется - скину.

    п.с нашел, вроде это:
    http://www.microsoft.com/whdc/system/vista/process_Vista.mspx

     
  8. ziral2088

    ziral2088 New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    283
    Rel
    спасибо, так и сделаю.
    freyr
    На Хп такая же ерунда, а там нет protected mode.

    Всем спасибо, решил сделать дедовским методом через простое копирование токена и изменения сессии. Заказ увы ждать не может. :dntknw: