Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2007.02.25;
Скачать: [xml.tar.bz2];

Вниз

Процесс от имени другого юзера - как? (почему не работает?)   Найти похожие ветки 

 
spok   (2006-10-16 22:43) [0]

Здравствуйте!
 Пожалуйста, помогите: приведите РАБОТАЮЩИЙ код запуска программы от имени другого пользователя. Стоит WinXPproSp2 в стандартной поставке со всеми апдейтами (говорю, потому что ни один собственный код трёхлетней давности не работает: что-то поменялось, но что??? Например, тест #1: LogonUser() с пустым паролем - уже не прокатывает (кажется, на sp1 ещё работало) ). Последняя здравая мысль - дело в политиках безопасности, но не нашёл ни малейшего намёка... Или как можно обойти (вплоть до стороннего сервиса, который умеет запускать от имени другого пользователя).


 
Ketmar ©   (2006-10-16 22:49) [1]

что, и CreateProcessAsUser() не работает? код в студию тогда. иначе будет просто большой флэйм. %-)


 
spok   (2006-10-16 22:54) [2]

Ну, например, мой любимый и самый второй... (модуль intProc - точно работал три года назад на win2k).
----------------------------------

Function StartInteractiveClientProcess(const strUsername, strDomain, strPassword,strCommandLine:String): Boolean;
var
 lpszUsername  : PAnsiChar;
 lpszDomain    : PAnsiChar;
 lpszPassword  : PAnsiChar;
 lpCommandLine : PAnsiChar;
 hToken: THANDLE;
 hhdesk: HDESK;
 hhwinsta,hwinstaSave: HWINSTA;
 pi: TProcessInformation;
 ppSid: PSID;
 si: TStartupInfo;
 bResult: Boolean;
label
 CleanUp;
begin
 bResult:= FALSE;
 hhwinsta:= 0;
 hwinstaSave:=0;
 hhdesk:=0;
 ppSid:=nil;
 
 lpszUsername  := StrToPChar(strUsername);
 lpszDomain    := StrToPChar(strDomain);
 lpszPassword  := StrToPChar(strPassword);
 lpCommandLine := StrToPChar(strCommandLine);

 // Ïðîöåäóðà èíòåðàêòèâíîã&# 238; âõîäà íîâîãî ïîëüçîâàòåëÿ.
 if not LogonUser(lpszUsername,lpszDomain,lpszPassword,
        LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT,hToken)
 then goto CleanUp;

 // Ñîõðàíÿåì îïèñàòåëü îêîííîé ñòàíöèè íàøåãî ïðîöåññà
 hwinstaSave:= GetProcessWindowStation();
 if hwinstaSave = 0 then goto Cleanup;

 // Ïîëó÷àåì îïèñàòåëü èíòåðàêòèâíîé îêîííîé ñòàíöèè
 hhwinsta:= OpenWindowStation("winsta0",FALSE,READ_CONTROL or WRITE_DAC);
 if hhwinsta = 0 then goto Cleanup;

 // Äëÿ ïîëó÷åíèÿ ïðàâèëüíîãî àêòèâíîãî ðàáî÷åãî ñòîëà
 // ìåíÿåì îêîííóþ ñòàíöèþ íàøåãî ïðîöåññà íà èíòåðàêòèâíóþ
 if not SetProcessWindowStation(hhwinsta) then goto Cleanup;

 // Ïîëó÷àåì îïèñàòåëü èíòåðàêòèâíîã&# 238; ðàáî÷åãî ñòîëà
 hhdesk:= OpenDesktop("default", 0, FALSE,
   READ_CONTROL or WRITE_DAC or DESKTOP_WRITEOBJECTS or DESKTOP_READOBJECTS);

 // Âîññòàíàâëèâà&# 229;ì ïðåäûäóùóþ îêîííóþ ñòàíöèþ äëÿ íàøåãî ïðîöåññà
 if not SetProcessWindowStation(hwinstaSave) then goto Cleanup;
 if hhdesk = 0 then  goto Cleanup;

 // Ïîëó÷àåì SID äëÿ ñåññèè èíòåðàêòèâíîã&# 238; ïîëüçîâàòåëÿ ...
 if not GetLogonSID(hToken, ppSid) then goto Cleanup;

 //... è äàåì ýòîìó ïîëüçîâàòåëþ ïîëíûé äîñòóï ê èíòåðàêòèâíîé îêîííîé ñòàíöèè...
 if not AddAceToWindowStation(hhwinsta, ppSid) then goto Cleanup;

 // ... è èíòåðàêòèâíîì&# 243; ðàáî÷åìó ñòîëó
 if not AddAceToDesktop(hhdesk, ppSid) then goto Cleanup;

 // Impersonate client to ensure access to executable file.
 if not ImpersonateLoggedOnUser(hToken) then goto Cleanup;

 // Initialize the STARTUPINFO structure.
 // Specify that the process runs in the interactive desktop.
 ZeroMemory(@si,sizeof(TSTARTUPINFO));
 si.cb:= sizeof(TSTARTUPINFO);
 si.lpDesktop:=StrToPChar("winsta0\default");

 // Launch the process in the client"s logon session.
 bResult:= CreateProcessAsUser(
     hToken,               // client"s access token
     nil,                  // file to execute
     lpCommandLine,        // command line
     nil,                  // pointer to process SECURITY_ATTRIBUTES
     nil,                  // pointer to thread SECURITY_ATTRIBUTES
     FALSE,                // handles are not inheritable
     NORMAL_PRIORITY_CLASS or
     CREATE_NEW_CONSOLE,   // creation flags
     nil,                  // pointer to new environment block
     nil,                  // name of current directory
     si,                   // pointer to STARTUPINFO structure
     pi                    // receives information about new process
   );
 LastError_StartInteractiveClientProcess := GetLastError;

 // End impersonation of client.
 RevertToSelf();
 if(bResult)and(pi.hProcess<>INVALID_HANDLE_VALUE)then begin
   WaitForSingleObject(pi.hProcess, INFINITE);
   CloseHandle(pi.hProcess);
 end;
 if (pi.hThread <> INVALID_HANDLE_VALUE) then CloseHandle(pi.hThread);

CleanUp:
 if(hwinstaSave <> 0) then SetProcessWindowStation (hwinstaSave);

 // Free the buffer for the logon SID.
 if ppSid <> nil Then FreeLogonSID(ppSid);

 // Close the handles to the interactive window station and desktop.
 if hhwinsta <> 0 Then CloseWindowStation(hhwinsta);
 if hhdesk <> 0   Then   CloseDesktop(hhdesk);

 // Close the handle to the client"s access token.
 if (hToken <> INVALID_HANDLE_VALUE) Then CloseHandle(hToken);

 StrDispose(lpszUsername);
 StrDispose(lpszDomain);
 StrDispose(lpszPassword);
 StrDispose(lpCommandLine);
 Result:=bResult;
end;


 
spok   (2006-10-16 23:03) [3]

Кстати, бинарник тоже не работает. И тоже вылетает на LogonUser(). Чаще других выскакивает ентот еррор: ERROR_ACCOUNT_RESTRICTION


 
Ketmar ©   (2006-10-16 23:37) [4]

не понял, что ты сделать пытаешься. залогинить второго юзера, что ли? чем простой (хихик %-) CreateProcessAsUser() не угодил?


 
Ketmar ©   (2006-10-16 23:38) [5]

есть подозрение, что LogonUser() валится из-за "fast user switching" и связаной с этим логики, которую добавили в новые версии.


 
Ketmar ©   (2006-10-16 23:44) [6]

зыж или забыл какие-то привилегии получить.


 
Eraser ©   (2006-10-16 23:48) [7]

> [2] spok   (16.10.06 22:54)

а зачем эти хитрые манипуляции с десктопами и виндовстешнами?
___

а еще есть такая замечательная ф-ия, как CreateProcessWithLogonW.
#define UNICODE
#define _WIN32_WINNT 0x0500

#include <windows.h>
#include <stdio.h>
#include <userenv.h>

void DisplayError(LPWSTR pszAPI)
{
   LPVOID lpvMessageBuffer;

   FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
       FORMAT_MESSAGE_FROM_SYSTEM,
       NULL, GetLastError(),
       MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
       (LPWSTR)&lpvMessageBuffer, 0, NULL);

   //
   //... now display this string
   //
   wprintf(L"ERROR: API        = %s.\n", pszAPI);
   wprintf(L"       error code = %d.\n", GetLastError());
   wprintf(L"       message    = %s.\n", (LPWSTR)lpvMessageBuffer);

   //
   // Free the buffer allocated by the system
   //
   LocalFree(lpvMessageBuffer);

   ExitProcess(GetLastError());
}

void wmain(int argc, WCHAR *argv[])
{
   DWORD     dwSize;
   HANDLE    hToken;
   LPVOID    lpvEnv;
   PROCESS_INFORMATION pi = {0};
   STARTUPINFO         si = {0};
   WCHAR               szUserProfile[256] = L"";

   si.cb = sizeof(STARTUPINFO);
   
   if (argc != 4)
   {
       wprintf(L"Usage: %s [user@domain] [password] [cmd]", argv[0]);
       wprintf(L"\n\n");
       return;
   }

   //
   // TO DO: change NULL to "." to use local account database
   //
   if (!LogonUser(argv[1], NULL, argv[2], LOGON32_LOGON_INTERACTIVE,
           LOGON32_PROVIDER_DEFAULT, &hToken))
       DisplayError(L"LogonUser");

   if (!CreateEnvironmentBlock(&lpvEnv, hToken, TRUE))
       DisplayError(L"CreateEnvironmentBlock");

   dwSize = sizeof(szUserProfile)/sizeof(WCHAR);

   if (!GetUserProfileDirectory(hToken, szUserProfile, &dwSize))
       DisplayError(L"GetUserProfileDirectory");

   //
   // TO DO: change NULL to "." to use local account database
   //
   if (!CreateProcessWithLogonW(argv[1], NULL, argv[2],
           LOGON_WITH_PROFILE, NULL, argv[3],
           CREATE_UNICODE_ENVIRONMENT, lpvEnv, szUserProfile,
           &si, &pi))
       DisplayError(L"CreateProcessWithLogonW");

   if (!DestroyEnvironmentBlock(lpvEnv))
       DisplayError(L"DestroyEnvironmentBlock");

   CloseHandle(hToken);
   CloseHandle(pi.hProcess);
   CloseHandle(pi.hThread);
}



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.02.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.064 c
2-1170941650
niil
2007-02-08 16:34
2007.02.25
Загрузка картинки в Image из интернета


4-1160902734
kay
2006-10-15 12:58
2007.02.25
AttachConsole - как вызвать?


2-1170688939
di22222
2007-02-05 18:22
2007.02.25
Вопрос по автоматизации редактирования html-страницы


15-1170343464
vain
2007-02-01 18:24
2007.02.25
Картиночки


11-1143716182
Боб
2006-03-30 14:56
2007.02.25
Архив конференции KOL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский