Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как запустить LogonUser / 11 сообщений из 11, страница 1 из 1
07.04.2004, 15:23
    #32472205
RoVS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить LogonUser
Народ, подскажите, какие првилегии нужны процессу для запуска LogonUser. Устанавливаю SE_TCB_NAME, а в ответ получаю:Клиент не обладает требуемыми правами
...
Рейтинг: 0 / 0
07.04.2004, 16:54
    #32472422
Tracer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить LogonUser
Если я ничего не путаю, то SE_TCB_NAME можно установить только для usera ( не процесса ) через Lsa..чего-то там. Также, чтобы установка стала работать, нужно перезагрузиться.
...
Рейтинг: 0 / 0
08.04.2004, 09:33
    #32473045
RoVS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить LogonUser
Код: 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
08.04.2004, 10:48
    #32473195
Tracer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить LogonUser
авторВсе-таки привилегия назначается процессу.
В том что ты привел написано, что процесс должен иметь привелегию, и не более того. В случае SE_TCB_NAME у процесса она берётся от запустившего его пользователя.
Если ты приведешь работающий код, тогда я соглашусь, что не прав.
...
Рейтинг: 0 / 0
13.04.2004, 19:53
    #32479932
RoVS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить LogonUser
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
15.04.2004, 18:09
    #32483355
Tracer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить LogonUser
авторОдин момент, что-бы установить привилегию SE_TCB_NAME, необходимо иметь разрешение работать в режиме операционной системы (для win2000)

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

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

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

авторПод XP все нормально работало...
Да, в XP для LogonUser'a SE_TCB_NAME не требуется.
...
Рейтинг: 0 / 0
15.04.2004, 19:56
    #32483473
RoVS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить LogonUser
А как тогда быть??? Как программно разрешить запуск LogonUser???
...
Рейтинг: 0 / 0
16.04.2004, 13:37
    #32484225
Tracer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить LogonUser
Я уже говорил, при установки программы устанавливаешь 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
17.04.2004, 14:57
    #32485330
RoVS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить LogonUser
Ладно. Согласен. Дурак. Спасибо за помощь. Только скажи где об этом всем можно почтать. А то я читал MSDN и понял все не так...
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как запустить LogonUser / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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