проблема безопасности с API CreateProcess

Задача : Я пытаюсь отправить некоторые файлы с моего клиента на сервер. Я использую rsync для передачи данных. Я использую CreateProcess APi и передаю путь rsync вместе с параметрами.

Положительный случай: Когда я отправляю данные с локальных дисков, таких как «C:», где мои окна установлены, вышеуказанный метод работает должным образом и передает данные.

проблема : Когда я пытаюсь отправить данные подключенного диска (общий сетевой диск). CreateProcess завершается, но ошибка, которую я получаю, rsync не может найти файл.
Та же команда rsync, когда я запускаю в командной строке, все файлы успешно передаются без ошибок, но происходит сбой при передаче файлов с помощью CreateProcess.

Код :

    int CreateRsyncProcess(const wchar_t * ptrCommand)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
SECURITY_ATTRIBUTES sap,sat,sao;
HANDLE out;
DWORD pwExit;

//init the STARTUPINFO struct
memset(&si,0,sizeof(si));
si.cb=sizeof(si);

wstring cmd = L"";
cmd.append(ptrCommand);//proc sec attributes
sap.nLength=sizeof(SECURITY_ATTRIBUTES);
sap.lpSecurityDescriptor= NULL;
sap.bInheritHandle=1;

//thread sec attributes
sat.nLength=sizeof(SECURITY_ATTRIBUTES);
sat.lpSecurityDescriptor= NULL;
sat.bInheritHandle=1;//create the proc
if(!CreateProcess(NULL,(LPWSTR)cmd.c_str(),&sap,&sat,1,CREATE_NO_WINDOW,NULL,NULL,&si,&pi))
{
DWORD err = GetLastError();
if(out != INVALID_HANDLE_VALUE)
CloseHandle(out);

return 1;
}

//wait till the proc ends

WaitForSingleObject(pi.hProcess,INFINITE);

GetExitCodeProcess(pi.hProcess,&pwExit);

//close all
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
if(out != INVALID_HANDLE_VALUE)
CloseHandle(out);
TerminateProcess(pi.hProcess,0);return pwExit;

}

Rsync Cmd :
«C: \ Program Files \ cwRsync \ bin \ rsync.exe» -cvriHPDkREL —noimplied-dirs —stats -e ‘»C: \ Program Files \ cwRsync \ bin \ ssh» -o StrictHostKeyChecking = no -i «C: \ Program Files \ cwRsync \ bin \ rsync-key» ‘»/ cygdrive / Z / 64Bit» [email protected]: ~ / 6a90c592-2b3b-4088-8942-2106776c863a /

Это происходит из-за проблем безопасности или прав с CreateProcess или чем-то еще?
Пожалуйста, помогите, так как я застрял на этом.

Спасибо

РЕДАКТИРОВАТЬ: : Это работает нормально, как обычный процесс, но когда я запускаю его в сервисе, он не работает. Таким образом, в настоящее время проблема в том, что сервис не имеет доступа к сетевым ресурсам. Есть ли обходные пути для этого?

3

Решение

Поскольку, очевидно, вы работаете с Сервисом, вам, вероятно, нужно загрузить среду, чтобы иметь доступ к сопоставленным папкам.

Что-то вроде этого.

    DWORD dwIdCurrentSession = 0xFFFFFFFF;

WTS_SESSION_INFO* pSessionInfo = NULL;
DWORD dwSessionsCount = 0;
if(WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, &pSessionInfo, &dwSessionsCount))
{
for(int i=0; i<(int)dwSessionsCount; i++)
{
WTS_SESSION_INFO &si = pSessionInfo[i];
if(si.State == WTSActive)
{
dwIdCurrentSession = si.SessionId;
break;
}
}

WTSFreeMemory(pSessionInfo);
}

if(dwIdCurrentSession != 0xFFFFFFFF)
{
HANDLE hLoggedOnUserToken = NULL;
// Get Session User Token
if(WTSQueryUserToken(dwIdCurrentSession, &hLoggedOnUserToken))
{
LPVOID lpEnviroment = NULL;
if(CreateEnvironmentBlock(&lpEnviroment, hLoggedOnUserToken, false))
{
STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );

// Create Process
if(CreateProcessAsUser(hLoggedOnUserToken,
NULL,
(LPWSTR)cmd.c_str(),
NULL,
NULL,
FALSE,
CREATE_UNICODE_ENVIRONMENT,
lpEnviroment,
NULL,
&si,
&pi )
)
{
// Wait for finish......

// Clean up
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}

DestroyEnvironmentBlock(lpEnviroment);
}

CloseHandle(hLoggedOnUserToken);
}
}
1

Другие решения

Сопоставленные диски для каждого сеанса — службы в изолированном сеансе не могут получить доступ к сопоставленным дискам в пользовательских сеансах. Вам потребуется сопоставить диски в сеансе службы или использовать UNC-пути (вместо назначенных букв дисков) и предоставить пользователям службы доступ к общему ресурсу.

4

Какую конкретную операционную систему, например 32-битную Windows 7, 64-битную Windows 7 и т. Д., Вы используете? Кроме того, у вас есть UAC включен? Если UAC включен, проблема исчезнет, ​​когда вы запустите приложение от имени администратора.

В зависимости от того, как вы ответите на эти вопросы, я смогу оказать дополнительную помощь. Я должен был бы сделать некоторое исследование все же.

В настоящий момент, если UAC действительно является вашей проблемой, я предлагаю вам изучить возможность использования ShellExecuteEx. Функция RunElevated находится в Поездка на лифте Vista UAC вверх и вниз может быть полезным для вас. Для удобства я включу эту функцию здесь.

BOOL RunElevated(
HWND hwnd, LPCTSTR pszPath,
LPCTSTR pszParameters = NULL, LPCTSTR pszDirectory = NULL)
{
SHELLEXECUTEINFO shex;
memset( &shex, 0, sizeof( shex) );

shex.cbSize = sizeof(SHELLEXECUTEINFO);
shex.fMask = 0;
shex.hwnd = hwnd;
shex.lpVerb = _T("runas");
shex.lpFile = pszPath;
shex.lpParameters = pszParameters;
shex.lpDirectory = pszDirectory;
shex.nShow = SW_NORMAL;
return ::ShellExecuteEx(&shex);
}

Если использование ShellExecuteEx не является опцией, вы также можете попробовать функцию CreateProcessElevated, найденную в Vista UAC: полное руководство.

0
По вопросам рекламы [email protected]