Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > CreateProcessAsUser


Автор: azesmcar 16.6.2005, 13:38
Здравствуйте...нужно запустить программу под другим юзером. Т.е. виндоуз работает под user-ом а программу мою нужно запустить под администратором. runas не помогает. Так как через коммандную строку параметр password не принимает...требует обьязательного ввода пароля run-time. придеться писать свою программку типа runas. Тут написал кое что. Не работает...кто чем поможет???

Код

void main()
{
    HANDLE hToken = NULL;
    if ( LogonUser("Admin", NULL, "123", LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &hToken ) )
    {
        printf("Logon successfull\n");
        STARTUPINFO si = {0};
        PROCESS_INFORMATION pi = {0};
        si.cb = sizeof( STARTUPINFO );
        ImpersonateLoggedOnUser( hToken );
        if (CreateProcessAsUser( hToken, "C:\\WINDOWS\\SYSTEM32\\notepad.exe", NULL, NULL, NULL, true, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi ))
        {
            printf("Create successfull\n");
        } else
        {
            printf("Error occured, error code %d\n", GetLastError());
        }
    }
}

Автор: En_t_end 16.6.2005, 13:59
Попробуй находить диалог ввода пароля для использования чужой учетной записи... как только диалог - найден. Программно посылаешь сообщение ему, точнее его эдиту, в котором и пишешь пароль... далее жмешь батон(также через сообщения). ИМХО может поможет smile
Чтобы узнать имена всех нужных тебе вещей заюзай стандартный спай из поставки студии.

Автор: chaos 16.6.2005, 14:15
глянь здесь
http://www.codeguru.com/code/legacy/misc/CmdAsUserSource.zip

Автор: azesmcar 16.6.2005, 14:28
Цитата
Попробуй находить диалог ввода пароля для использования чужой учетной записи... как только диалог - найден. Программно посылаешь сообщение ему, точнее его эдиту, в котором и пишешь пароль... далее жмешь батон(также через сообщения). ИМХО может поможет
Чтобы узнать имена всех нужных тебе вещей заюзай стандартный спай из поставки студии.


Подобное извращение у меня тоже в мыслях прошло...но как то не хотелось...

Цитата
глянь здесь
http://www.codeguru.com/code/legacy/misc/CmdAsUserSource.zip


скачал...спасибо большое..но выдаеться таже ошибка что и у меня...

An error occurred: 1314 - CreateProcessAsUser. A required privilege is not held by the client.

Автор: _hunter 16.6.2005, 14:43
может у тебя просто Secondary Logon отключена?
виндовый runas работает?

Автор: En_t_end 16.6.2005, 14:48
_hunter
Да кстати... ил же у того юзверя(скорее всего гостя) просто нет прав пользоваться этим сервисом.

___Подобное извращение у меня тоже в мыслях прошло...но как то не хотелось...____
Всегда пожалуйста... через попу smile

Автор: azesmcar 16.6.2005, 14:52
Цитата
может у тебя просто Secondary Logon отключена?
виндовый runas работает?


Включен...runas нормально запускает...проблема в том что в runas нельзя передать параметром пароль...нужно обязательно вводить run-time...

Есть какой нибудь другой способ запустить программу???
пробую так (извините за оффтопик)

runas /user:admin notepad.exe | echo 123
runas /user:admin notepad.exe | type C:\1.txt
в файле 1.txt написан пароль (132)

runas /user:admin notepad.exe < C:\1.txt

Никак не работает...если можно будет так сойдет и так...главное чтоб работало..

Автор: _vlad 16.6.2005, 18:58
 сейчас не буду разбираться.. просто помню, что у меня без проблем работал код (правда в Win2000 под админом, с запуском Win32-приложения, а другие варианты не пробовал)
Код
token := LogonUser(UserName, Domain, Password, LOGON32_LOGON_INTERACTIVE,
  LOGON32_PROVIDER_DEFAULT);
FillChar(si, SizeOf(si), 0);
si.cb := SizeOf(si);
si.dwFlags := STARTF_USESHOWWINDOW;
si.wShowWindow := CmdShow;
pi := CreateProcessAsUser(token, '', CmdLine, nil, nil, False, 0, nil, '', si);
где LogonUser и CreateProcessAsUser - методы объекта-обертки, вызывающие API-функции LogonUserA, CreateProcessAsUserA   

Автор: azesmcar 17.6.2005, 08:25
Код

void main()
{
    HANDLE hToken = NULL;
    if ( LogonUser("Admin", NULL, "123", LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &hToken ) )
    {
        printf("Logon successfull\n");
        STARTUPINFO si = {0};
        PROCESS_INFORMATION pi = {0};
        si.cb = sizeof( STARTUPINFO );
        ImpersonateLoggedOnUser( hToken );
        if (CreateProcessAsUser( hToken, "C:\\WINDOWS\\SYSTEM32\\notepad.exe", NULL, NULL, NULL, true, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi ))
        {
            printf("Create successfull\n");
        } else
        {
            printf("Error occured, error code %d\n", GetLastError());
        }
    }
}


А у меня что написано??? То же самое только на С++
GetLastError() выдает ошибку 1314

Автор: En_t_end 8.7.2005, 15:02
Кстати порылся сейчас в МСДН. Попробуй CreateProcessWithLogonW
Может у тебя со студией что-то и дефайниться не та функция.

Автор: p0s0l 9.7.2005, 00:16
Цитата(azesmcar @ 16.6.2005, 14:28)
An error occurred: 1314 - CreateProcessAsUser. A required privilege is not held by the client.

Попробуй проверь привилегии и выстави их, если нет:
Цитата(MSDN)
Typically, the process that calls the CreateProcessAsUser function must have the SE_ASSIGNPRIMARYTOKEN_NAME and SE_INCREASE_QUOTA_NAME privileges. However, if hToken is a restricted version of the caller's primary token, the SE_ASSIGNPRIMARYTOKEN_NAME privilege is not required.


Добавлено @ 00:19
В проге из ссылки chaosа сказано про необходимые привилегии:
Код
    ::_tprintf(_T("   The calling process needs to either have administrative privileges (ie in\n"));
    ::_tprintf(_T("   the local adminstrators group) or at LEAST the following privileges:\n"));        
    ::_tprintf(_T("      \"Act as part of the operating system\" (SeTcbPrivilege),\n"));    
    ::_tprintf(_T("      \"Bypass traverse checking\" (SeChangeNotifyPrivilege),\n"));
    ::_tprintf(_T("      \"Increase quotas\" (SeIncreaseQuotaPrivilege),\n"));
    ::_tprintf(_T("      \"Replace a process level token\" (SeAssignPrimaryTokenPrivilege).\n"));     

Автор: DoZENT 20.7.2006, 18:17
Цитата

Попробуй проверь привилегии и выстави их, если нет

А как это сделать? 

Автор: Doc_d0s 21.7.2006, 10:28
А у меня проблема с LogonUserW выдает сообщение 1326, чего это значет не могу найтиsmile 

Автор: _hunter 21.7.2006, 10:52
Logon failure: unknown user name or bad password.  

Автор: 586 21.7.2006, 11:01
Цитата(Doc_d0s @  21.7.2006,  11:28 Найти цитируемый пост)
выдает сообщение 1326

Вход в систему не произведен: имя пользователя или пароль не опознаны.  

Автор: Doc_d0s 25.7.2006, 11:10
и все таки, кто нибудь ответит на вопрос как выставить права:? 

Автор: _hunter 25.7.2006, 12:10
а при чем тут права? 

Автор: Doc_d0s 25.7.2006, 12:21
Я имею ввиду привелегии... 

Автор: Doc_d0s 29.7.2006, 13:27
Код


BOOL SetPrivilege(char *aPrivilegeName,BOOL aEnabled, HANDLE *hToken)
{
PTOKEN_PRIVILEGES TPPrev, TP;
DWORD    dwRetLen;
BOOL    Result=FALSE;
TP=new TOKEN_PRIVILEGES;
TPPrev=new TOKEN_PRIVILEGES;
TP->PrivilegeCount=1;

if (LookupPrivilegeValueA(NULL,aPrivilegeName,&TP->Privileges[0].Luid))
{
 if (aEnabled)
  TP->Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
 else
  TP->Privileges[0].Attributes=0;
 dwRetLen=0;
 Result=AdjustTokenPrivileges(hToken,FALSE,TP,sizeof(TPPrev), TPPrev,&dwRetLen);
}
return Result;
}

Код

if(LogonUserA(UserName,".",UserPassword,LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT,&hToken))
  {
   printf("\n\t\t\tlogon complete\n");
   if(!SetPrivilege("SeIncreaseQuotaPrivilege",TRUE,&hToken))
    printf("\n\t\t\tERROR_1 %d\n",GetLastError());
   if(!SetPrivilege("SeAssignPrimaryTokenPrivilege",TRUE,&hToken))
    printf("\n\t\t\tERROR_2 %d\n",GetLastError());
   if(!CreateProcessAsUserA( hToken,
          NULL,
          "C:\\windows\\hh.exe",
          NULL,
          NULL,
          FALSE,
          NULL,
          NULL,
          NULL,
          &cif,
          &pi))
   printf("\n\t\t\tERROR %d\n",GetLastError());
  }

вот код, выдает 3 ошибки 2 при вызове SetPrivilege #6, и уже известная #1314
почему не работает ф-ия SetPrivelege, при вызове AdjustTokenPrivileges выдается ошибка #6-Invalid Token
выши предложения 

Автор: Doc_d0s 29.7.2006, 22:12
Взял пример ф-ии SetPrivilege из MSDN там говориться что в токене нет привелегий:
"SeAssignPrimaryTokenPrivilege","SeTcbPrivilege"
вот вопрос собственно как их добавить:?
AdjustTokenPrivileges не советовать ибо и так с ней любовью занимаюсь)
 

Автор: TP09H 14.9.2006, 11:47
Пишу этот текст уже 3-й раз!!! smile Итак!Как,не зная пароля пользователя(и,соответственно,не получив hToken с помощью LogonUser),создать процесс CreateProcessAsUser'ом от имени System(дабы Таск Манагер не спалил мою прогу(в самом деле,SvcHost от имени обычного юзера-очень заметно даже для ламеров))?Конечно,можно действовать перебором,но перебирать 4294967296 значений hToken-это ОООООООЧЕНЬ долго!Кто знает,напишите на мыло apixosoft(зарегген на mail.ru,без всяких дополнений(а то тут стоит один и всё говорит,что там ещё куча доменов)-то есть логин@mail.ru) smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)