powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как запустить LogonUser
11 сообщений из 11, страница 1 из 1
Как запустить LogonUser
    #32472205
RoVS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ, подскажите, какие првилегии нужны процессу для запуска LogonUser. Устанавливаю SE_TCB_NAME, а в ответ получаю:Клиент не обладает требуемыми правами
...
Рейтинг: 0 / 0
Как запустить LogonUser
    #32472422
Tracer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я ничего не путаю, то SE_TCB_NAME можно установить только для usera ( не процесса ) через Lsa..чего-то там. Также, чтобы установка стала работать, нужно перезагрузиться.
...
Рейтинг: 0 / 0
Как запустить LogonUser
    #32473045
RoVS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
Windows  2000 :  The process calling LogonUser requires the SE_TCB_NAME privilege. If the calling process does not have this privilege, LogonUser fails and GetLastError returns ERROR_PRIVILEGE_NOT_HELD. In some cases, the process that calls LogonUser must also have the SE_CHANGE_NOTIFY_NAME privilege enabled; otherwise, LogonUser fails and GetLastError returns ERROR_ACCESS_DENIED. This privilege is not required for the local system account or accounts that are members of the administrators group. By default, SE_CHANGE_NOTIFY_NAME is enabled for all users, but some administrators may disable it for everyone. For more information about privileges, see Privileges.

Все-таки привилегия назначается процессу.
...
Рейтинг: 0 / 0
Как запустить LogonUser
    #32473195
Tracer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВсе-таки привилегия назначается процессу.
В том что ты привел написано, что процесс должен иметь привелегию, и не более того. В случае SE_TCB_NAME у процесса она берётся от запустившего его пользователя.
Если ты приведешь работающий код, тогда я соглашусь, что не прав.
...
Рейтинг: 0 / 0
Как запустить LogonUser
    #32479932
RoVS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2Tracer

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
__declspec(dllexport)
    bool    WINAPI SetPrivileges()
    {
        HANDLE  hToken,hTokenUser;
        LONG Res;
        TOKEN_PRIVILEGES    tp;

        Res= OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
        if(!Res)
            return  false;

        Res= LookupPrivilegeValue( "", SE_RESTORE_NAME , &tp.Privileges[0 ].Luid);
        if(!Res)
            return  false;
        tp.Privileges[ 0 ].Attributes = SE_PRIVILEGE_ENABLED;
        tp.PrivilegeCount   =  1 ;
        Res= AdjustTokenPrivileges(hToken, false, &tp,  0 ,NULL,NULL);
        if(!Res)
            return  false;

        Res= LookupPrivilegeValue("", SE_TCB_NAME, &tp.Privileges[ 0 ].Luid);
        if(!Res)
            return  false;
        tp.Privileges[ 0 ].Attributes = SE_PRIVILEGE_ENABLED;
        tp.PrivilegeCount   =  1 ;
        Res= AdjustTokenPrivileges(hToken, false, &tp,  0 ,NULL,NULL);
        if(!Res)
            return  false;
        CloseHandle(hToken);
        return  true;
    }
__declspec(dllexport)
    bool    WINAPI LoadProfile(char *UserName,char *Domain,char *UserPassword)
    {
        HANDLE  hTokenUser;
        LONG Res;

        Res= SetPrivileges();
        if(!Res)
            return  false;

        Res= LogonUser(
            UserName,
            Domain,
            UserPassword,
            LOGON32_LOGON_INTERACTIVE,
            LOGON32_PROVIDER_DEFAULT,
            &hTokenUser);
        if(!Res)
            return  false;

        PROFILEINFO    inf;
        inf.dwSize          = sizeof(PROFILEINFO);
        inf.dwFlags         = PI_APPLYPOLICY;
        inf.lpUserName      = UserName;
        inf.lpProfilePath   = NULL;
        inf.lpDefaultPath   = NULL;
        inf.lpServerName    = NULL;
        inf.lpPolicyPath    = NULL;
        inf.hProfile        = NULL;

        Res= LoadUserProfile(hTokenUser,&inf);
        if(!Res)
            return  false;
        return  true;
    }


Один момент, что-бы установить привилегию SE_TCB_NAME, необходимо иметь разрешение работать в режиме операционной системы (для win2000)
...
Рейтинг: 0 / 0
Как запустить LogonUser
    #32483355
Tracer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторОдин момент, что-бы установить привилегию SE_TCB_NAME, необходимо иметь разрешение работать в режиме операционной системы (для win2000)

Блин, нет слов. Так SE_TCB_NAME и есть "Act as part of the Operating System" right. Убери вызов SetPrivileges, у тебя и так всё будет работать.
...
Рейтинг: 0 / 0
Как запустить LogonUser
    #32483452
RoVS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все может быть, но у меня привилегия не устанавливалась без этого разрешения под 2000. Под XP все нормально работало...
...
Рейтинг: 0 / 0
Как запустить LogonUser
    #32483468
Tracer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВсе может быть, но у меня привилегия не устанавливалась без этого разрешения под 2000.

Ещё раз ...
Эта привилегия и есть "это разрешение".

Т.е. авторОдин момент, что-бы установить привилегию SE_TCB_NAME, необходимо иметь разрешение работать в режиме операционной системы (для win2000)
Читаем так, чтобы бы установить привилегию SE_TCB_NAME( для процесса ), необходимо иметь SE_TCB_NAME для запустившего его юзера,каковую привилегию устанавливать нет никакой необходимости ( для процесса ), поскольку она берётся от юзера.
Что и требовалось доказать.

авторПод XP все нормально работало...
Да, в XP для LogonUser'a SE_TCB_NAME не требуется.
...
Рейтинг: 0 / 0
Как запустить LogonUser
    #32483473
RoVS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как тогда быть??? Как программно разрешить запуск LogonUser???
...
Рейтинг: 0 / 0
Как запустить LogonUser
    #32484225
Tracer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я уже говорил, при установки программы устанавливаешь SE_TCB_NAME для юзера, потом перегружаешься, и всё.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
void SetPriv( LPCTSTR domain_name, LPCTSTR user_name )
{
    NET_API_STATUS    nasResult;
    DWORD             parm_err =  0 ;
    PSID pSid         = NULL;
    DWORD cbSid       =  0 ;
    LPTSTR Domain     = NULL;
    DWORD cbDomain    =  0 ;
    SID_NAME_USE      SidNameUse;
    
    if ( LookupAccountName(
        domain_name,
        user_name,
        pSid,
        &cbSid,
        Domain,
        &cbDomain,
        &SidNameUse))
    {
        throw  "Failed LookupAccountName" ;
    }
    else
    {
        DWORD dwError = GetLastError();
        
        if ( ERROR_INSUFFICIENT_BUFFER == dwError )
        {
            pSid = (PSID)LocalAlloc( LMEM_FIXED, cbSid );
            Domain = (LPTSTR)LocalAlloc( LMEM_FIXED, cbDomain );
            
            if ( !LookupAccountName(
                domain_name,
                user_name,
                pSid,
                &cbSid,
                Domain,
                &cbDomain,
                &SidNameUse))
            {
                throw  "Failed LookupAccountName" ;
            }
        }
        else
        {
            throw  "Failed LookupAccountName" ;
        }
    }
    
    if ( Domain != NULL )
    {
        LocalFree( Domain );
    }
    
    LSA_OBJECT_ATTRIBUTES ObjectAttributes;
    LSA_HANDLE lsahPolicyHandle;
    LSA_UNICODE_STRING lsaUserRights;
    
    ZeroMemory( &ObjectAttributes, sizeof( ObjectAttributes ) );
    
    nasResult = LsaOpenPolicy(
        NULL,
        &ObjectAttributes,
        POLICY_ALL_ACCESS,
        &lsahPolicyHandle );
    
    if ( NERR_Success != nasResult )
    {
        throw  "Failed LsaOpenPolicy" ;
    }
    
    lsaUserRights.Length = (USHORT)( _tcslen( SE_TCB_NAME ) * sizeof( WCHAR ) );
    lsaUserRights.Buffer = L "SeTcbPrivilege" ;
    lsaUserRights.MaximumLength = (USHORT)( lsaUserRights.Length + sizeof( WCHAR ) );
    
    nasResult = LsaAddAccountRights( lsahPolicyHandle, pSid, 
        &lsaUserRights,  1  );
    if ( nasResult !=  0  )
    {
        throw  "Failed LsaAddAccountRights" ;
    }
    
    nasResult = LsaClose( lsahPolicyHandle );
    
    if ( pSid != NULL )
    {
        LocalFree( pSid );
    }
}
...
Рейтинг: 0 / 0
Как запустить LogonUser
    #32485330
RoVS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ладно. Согласен. Дурак. Спасибо за помощь. Только скажи где об этом всем можно почтать. А то я читал MSDN и понял все не так...
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как запустить LogonUser
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]