![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как запустить процесс под другим пользователем? [NT4, Win2k, WinXP]
ng_softman © (2003-05-09 10:26:00)Как, зная имяи парольдругого пользователя, запустить процесс, чтобы тот имел все
привелегии данного пользователя, или хотябы как получить токен контекста безопасности
и/или ACE (Access Control Entry).
функции
- LoginUser & CreateProcesssAsUser
- CreateProcessWithLogonW
выдают ошибку: "A required privilege is not held by the client."
ZZ (2003-05-10 14:46:00) [1]Без потугов со стороны админа - ничего. Если есть возможность поработать под админом хоть один раз, то LogonUser/CreateProcesAsUser могут работать из сервиса, можно добавить нужные права (не рекомендуется, иначе бы их просто не убирали) всем. И много чего еще, но для настройки этого нужны права админа :(
ng_softman (2003-05-10 12:25:00) [2]2 zz: thanks. Но проблема в том что CreateProcessWithLogonW работает от 2К и выше, а как быть с NT4.
AntonCFG (2003-05-10 09:33:00) [3]Удалено модератором
Примечание: Задай вопрос в СВОЕЙ ветке
ZZ (2003-05-10 08:52:00) [4]Ты будешь смеяться, но эта функция работает :) (правда если изменить L"logon.exe" на L"cmd.exe" ) Ошибок не возвращает.. Вот только для полного счастья поставь 4ым параметром 2, а не 1.
W2000SP2 сеть без домена.
ng_softman (2003-05-09 15:04:00) [5]>Определись в желаниях.
>А лучше покажи НЕРАБОЧИЙ код с CreateProcessWithLogonW
2 zz не забудь прописать параметры командной строки
Requirements
Windows NT/2000: Requires Windows 2000.
Windows 95/98: Unsupported.
Header: Declared in Winbase.h; include Windows.h.
Library: Use Advapi32.lib.
Unicode: Implemented only as Unicode.
/***************
* CreatePWL.cpp
*
***************/
#ifndef UNICODE
#define UNICODE
#endif
#include "windows.h"
#include
typedef BOOL (WINAPI *LPCreateProcessWithLogonW)
(LPCWSTR lpUsername, // user"s name
LPCWSTR lpDomain, // user"s domain
LPCWSTR lpPassword, // user"s password
DWORD dwLogonFlags, // logon option
LPCWSTR lpApplicationName, // executable module name
LPWSTR lpCommandLine, // command-line string
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // new environment block
LPCWSTR lpCurrentDirectory, // current directory name
LPSTARTUPINFOW lpStartupInfo, // startup information
LPPROCESS_INFORMATION lpProcessInfo // process information
);
int ErrMsg()
{
int nErr = GetLastError();
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL, // message source
nErr, // message id
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // default language
(LPTSTR) &lpMsgBuf,
0,
NULL);
wprintf(L"%s\n", lpMsgBuf);
// Free the buffer.
LocalFree( lpMsgBuf );
return nErr;
}
/*
argv[1] - domain
argv[2] - user name
argv[3] - password
*/
int wmain(int argc, wchar_t *argv[])
{
// all parameters are required
//
if (argc != 4)
{
fwprintf(stderr, L"Usage: %s \\\\Domain UserName Password\n", argv[0]);
return 1;
}
int lResult = 0;
HINSTANCE hLib = LoadLibrary(L"advapi32.dll");
if ( hLib != NULL )
{
__try {
STARTUPINFO si;
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.lpDesktop = NULL; // TEXT("winsta0\\default");
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
LPCreateProcessWithLogonW CreateProcessWL;
CreateProcessWL = (LPCreateProcessWithLogonW) GetProcAddress(hLib, "CreateProcessWithLogonW");
if ( CreateProcessWL != NULL )
{
if ( CreateProcessWL(
argv[2], // username
argv[1], // domain
argv[3], // password
1, // LOGON_WITH_PROFILE
NULL, L"logon.exe", // app name & cmd line
CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS,
NULL, NULL,
&si, &pi) )
{
wprintf(L"Ok!!!!!!!\n");
}
else
lResult = ErrMsg();
}
}
__finally
{
FreeLibrary(hLib);
}
}
else
lResult = ErrMsg();
return lResult;
}
ZZ (2003-05-09 13:58:00) [6]Определись в желаниях.
А лучше покажи НЕРАБОЧИЙ код с CreateProcessWithLogonW