Текущий архив: 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.49 MB
Время: 0.06 c