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? Почему процессу не удается отправить сообщения по указанному выше пути на сервер.
Несколько вещей, которые я уже пробовал:
Я вхожу в приложение, используя мое доменное имя и учетные данные Windows, и в коде, используя::LogonUser(). Я дважды проверил, что я отправляю действительные учетные данные.
Используя проводник, я могу успешно перейти по указанному выше пути на сервере и могу добавлять / удалять файлы.
Я добавил свой идентификатор пользователя в "Локальные настройки безопасности" в разделе "Администрирование" >> "Локальная политика безопасности".
Любые предложения приветствуются.
1 ответ
Мне удалось выяснить ответ: моя удаленная база данных и консолидированная база данных находились на двух разных машинах, которые принадлежали разным доменам. Пользователь, с которым я входил в удаленную базу данных, не смог получить доступ к папкам на консолидированной машине. Предоставление пользователю прав доступа к консолидированной машине решило проблему.