CreateProcessAsUser

Тема в разделе "WASM.WIN32", создана пользователем doc_d0s, 1 авг 2006.

  1. doc_d0s

    doc_d0s New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2006
    Сообщения:
    2
    Код (Text):
    1. if(LogonUserA(UserName,NULL,UserPassword,LOGON32_LOGON_INTERACTIVE,NULL,&hToken))
    2.             {
    3.                 printf("\n\t\t\tlogon complete\n");
    4.                
    5.  
    6.                 if(!CreateProcessAsUserA(  
    7.                                             hToken,
    8.                                             NULL,
    9.                                             "cmd.exe",
    10.                                             NULL,
    11.                                             NULL,
    12.                                             FALSE,
    13.                                             CREATE_NEW_CONSOLE,
    14.                                             NULL,
    15.                                             NULL,
    16.                                             &cif,
    17.                                             &pi))
    18.                 printf("\n\t\t\tERROR %d\n",GetLastError());
    19.             }
    20.             else
    21.             {
    22.                 printf("\n\t\t\tLogon Fault!!!\n");
    23.                 return 0;
    24.             }
    Суть проблемы в том что данный кусок кода выдает ошибку под номером 1314, ошибка сообщает что не хватает привелегий при попытке устнавить 3 (SeTcbPrivilege,SeIncreaseQuotaPrivilege,SeAssignPrimaryTokenPrivilege)привелегии с помощью ф-ии:
    Код (Text):
    1. BOOL SetPrivilege(LPCSTR lpszPrivilege,BOOL bEnablePrivilege)
    2. {
    3.     TOKEN_PRIVILEGES tp;
    4.     LUID luid;
    5.     HANDLE hToken;
    6.  
    7.     if ( !LookupPrivilegeValueA(
    8.                                 NULL,            // lookup privilege on local system
    9.                                 lpszPrivilege,   // privilege to lookup
    10.                                 &luid ) )        // receives LUID of privilege
    11.     {
    12.             printf("\n\t\t\tLookupPrivilegeValue error: %u\n", GetLastError() );
    13.             return FALSE;
    14.     }  
    15.     if(OpenProcessToken(    GetCurrentProcess(),
    16.                             TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES|TOKEN_ADJUST_DEFAULT|TOKEN_ASSIGN_PRIMARY,
    17.                             &hToken))
    18.     {
    19.         tp.PrivilegeCount = 1;
    20.     }
    21.     else
    22.     {
    23.         printf("\n\t\t\tOpenProcessToken ERROR #%u\n",GetLastError());
    24.         return FALSE;
    25.     }
    26.    
    27.     tp.Privileges[0].Luid = luid;
    28.     if (bEnablePrivilege)
    29.         tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    30.     else
    31.         tp.Privileges[0].Attributes = 0;
    32.  
    33.         // Enable the privilege or disable all privileges.
    34.  
    35.     if ( !AdjustTokenPrivileges(
    36.                                     hToken,
    37.                                     FALSE,
    38.                                     &tp,
    39.                                     sizeof(TOKEN_PRIVILEGES),
    40.                                     (PTOKEN_PRIVILEGES) NULL,
    41.                                     (PDWORD) NULL) )
    42.     {
    43.             printf("AdjustTokenPrivileges error: %u\n", GetLastError() );
    44.             return FALSE;
    45.     }
    46.  
    47.     if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
    48.     {
    49.             printf("\n\t\t\tThe token does not have the specified privilege. \n");
    50.             return FALSE;
    51.     }
    52. //  CloseHandle(hToken);
    53.     return TRUE;
    54. }
    вот таким способом
    Код (Text):
    1. if(!SetPrivilege(LPCSTR("SeAssignPrimaryTokenPrivilege"),TRUE))
    2.                     printf("\n\t\t\tERROR_0 %d\n",GetLastError());
    3.  
    4.                 if(!SetPrivilege(LPCSTR("SeIncreaseQuotaPrivilege"),TRUE))
    5.                     printf("\n\t\t\tERROR_1 %d\n",GetLastError());
    6.  
    7.                 if(!SetPrivilege(LPCSTR("SeTcbPrivilege"),TRUE))
    8.                     printf("\n\t\t\tERROR_2 %d\n",GetLastError());
    сообщает мне что SeAssignPrimaryTokenPrivilege и SeTcbPrivilege нет в токене, вопрос собственно как добавить:? в токен
     
  2. doc_d0s

    doc_d0s New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2006
    Сообщения:
    2
    Какие необходимы привелегии для благополучного выполнения ф-ии:?
     
  3. SSS

    SSS New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2003
    Сообщения:
    12
    А добавить их можно при помощи LSA (см. LsaAddAccountRights), однако учитывая то, что добавление привилегий это изменение политики безопасности, то в силу они вступят только в новом сеансе пользователя.