Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.25;
Скачать: CL | DM;

Вниз

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

 
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 вся ветка

Текущий архив: 2007.02.25;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.032 c
11-1149736015
homm
2006-06-08 07:06
2007.02.25
Владимиру Кладову


15-1170648194
Slider007
2007-02-05 07:03
2007.02.25
С днем рождения ! 4 февраля


2-1170885198
MegaNop
2007-02-08 00:53
2007.02.25
Поменять цвет PageControl1


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


11-1149954658
Фдуч
2006-06-10 19:50
2007.02.25
Помогите с PCAsm