CreateProcessAsUser из службы имеет проблемы с безопасностью доступа к удаленной машине

Я пытаюсь синхронизировать мою локальную (удаленную) базу данных с централизованной консолидированной базой данных на сервере (используя базу данных Sybase). Синхронизация должна произойти в запланированное время, и я использую "CreateProcessByUser". Чтобы начать процесс синхронизации, я использую dbremote.exe, предоставляемый sybase.

Построенный аргумент commandLine:
commandLine = dbremote.exe -l 512K -x -k -c "dsn = HOME * * ; uid = dba; pwd = ***; cs = нет; DBKEY = ***" -os 10000000 -o "c: \ data \ test \ dbremote.log "" c: \ data \ test "

BOOL startA_Process( HANDLE hToken, _TCHAR *commandLine, PROCESS_INFORMATION *pi, BOOL wait, _TCHAR *errBuf){

STARTUPINFO sStartupInfo;

DWORD   dwExitCode;
DWORD   dwStatus        = 0;
DWORD   dwCreationFlags = CREATE_NEW_CONSOLE;
int     iResult;
BOOL    bInheritHandles = FALSE;

LPCTSTR     pszApplicationName      = NULL;
LPCTSTR     pszCurrentDirectory     = NULL;
LPVOID      pvEnvironment           = NULL;

LPSECURITY_ATTRIBUTES psProcessAttributes   = NULL;
LPSECURITY_ATTRIBUTES psThreadAttributes    = NULL;

//
// Initilize STARTUPINFO structure
//
ZeroMemory( &sStartupInfo, sizeof( sStartupInfo ) );
sStartupInfo.cb = sizeof( sStartupInfo );
sStartupInfo.lpTitle = _T("AutoSychDBRemote");
sStartupInfo.lpDesktop = _T("winsta0\\default");
//
// Initilize PROCESS_INFORMATION structure
//
ZeroMemory( pi, sizeof( PROCESS_INFORMATION ) );

iResult = ::CreateProcessAsUser(
    hToken,                     // handle to a token representing the logged-on user
    pszApplicationName,             // name of executable module
    (LPTSTR)commandLine,            // command line string
    psProcessAttributes,            // process security attributes
    psThreadAttributes,             // thread security attributes
    bInheritHandles,                // whether new process inherits handles
    dwCreationFlags,                // creation flags
    pvEnvironment,                  // pointer to new environment block
    pszCurrentDirectory,            // pointer to current directory name
    &sStartupInfo,                  // pointer to STARTUPINFO
    pi                              // pointer to PROCESS_INFORMATION
);

Процесс выполняется на удаленной машине, и когда происходит синхронизация, сообщения должны передаваться между удаленной и консолидированной базами данных.

Если я выполняю приведенную выше командную строку из командной строки Windows, синхронизация работает успешно. Но при запуске CreateProcessAsUser в назначенное время я вижу следующее сообщение об ошибке в файле журнала:

Журнальный файл:

I. 2013-04-11 11:17:11. Отправка сообщения в "БТИ"
I. 2013-04-11 11:17:11. Откройте ошибку "\\IPaddress\ Базы данных \ Производство \ messages \olid\Rem00005.g" 1326: Неверный аргумент
I. 2013-04-11 11:17:11. sopen "\\IPaddress\ Базы данных \ Производство \ messages \olid\Rem00005.h" ошибка 1326: неверный аргумент
I. 2013-04-11 11:17:13. sopen "\\IPaddress\ Базы данных \Production\messages\olid\Rem00005.i" ошибка 1326: неверный аргумент
I. 2013-04-11 11:17:13. sopen ошибка "\\IPaddress\ Базы данных \Production\messages\olid\Rem00005.j" 1326: неверный аргумент
I. 2013-04-11 11:17:13. sopen "\\IPaddress\ Базы данных \Production\messages\olid\Rem00005.k" ошибка 1326: неверный аргумент
E. 2013-04-11 11:17:13. Ошибка при отправке сообщения
I. 2013-04-11 11:17:13. Повторная отправка запросов в очереди
I. 2013-04-11 11:17:14. Выполнение завершено

где "\\ IP-адрес \ базы данных \ производство \ сообщения \ консолидация" - это папка на сервере, в которую копируются сообщения с удаленного компьютера

Я прошу вашей помощи по этому вопросу. Почему я могу синхронизироваться из командной строки, а не из CreateProcessAsUser? Почему процессу не удается отправить сообщения по указанному выше пути на сервер.

Несколько вещей, которые я уже пробовал:

  1. Я вхожу в приложение, используя мое доменное имя и учетные данные Windows, и в коде, используя::LogonUser(). Я дважды проверил, что я отправляю действительные учетные данные.

  2. Используя проводник, я могу успешно перейти по указанному выше пути на сервере и могу добавлять / удалять файлы.

  3. Я добавил свой идентификатор пользователя в "Локальные настройки безопасности" в разделе "Администрирование" >> "Локальная политика безопасности".

Любые предложения приветствуются.

1 ответ

Решение

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

Другие вопросы по тегам