来自服务的CreateProcessAsUser在访问远程计算机时存在安全问题

时间:2013-04-11 18:24:32

标签: database security permissions createprocessasuser

我正在尝试将本地(远程)数据库与服务器上的集中式统一数据库同步(使用Sybase数据库)。同步必须在预定的时间发生,我使用“CreateProcessByUser”。要启动同步过程,我使用的是sybase提供的dbremote.exe。

构造的commandLine参数是:
commandLine = dbremote.exe -l 512K -x -k -c“dsn = HOME * * ; uid = dba; pwd = *** ; cs = none; 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触发时,我在日志文件中看到以下错误消息:

  

日志文件:

     

予。 2013-04-11 11:17:11发送消息给“BTI”
  I. 2013-04-11 11:17:11 sopen“\\ IPaddress \ Databases \ Production \ messages \ consolidation \ Rem00005.g”   失败1326:无效的参数
  I. 2013-04-11 11:17:11 sopen“\\ IPaddress \ Databases \ Production \ messages \ consolidation \ Rem00005.h”   失败1326:无效的参数
  I. 2013-04-11 11:17:13 sopen“\\ IPaddress \ Databases \ Production \ messages \ consolidation \ Rem00005.i”   失败1326:无效的参数
  I. 2013-04-11 11:17:13 sopen“\\ IPaddress \ Databases \ Production \ messages \ consolidation \ Rem00005.j”   失败1326:无效的参数
  I. 2013-04-11 11:17:13 sopen“\\ IPaddress \ Databases \ Production \ messages \ consolidation \ 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. 我已将我的用户ID添加到管理工具>>下的“本地安全设置”中本地安全政策。

  4. 任何建议都表示赞赏。

1 个答案:

答案 0 :(得分:1)

我能够找到答案: 我的远程数据库和统一数据库位于属于不同域的两台不同的机器上。我登录到远程数据库的用户无法访问整合计算机上的文件夹。 授予用户对统一计算机的访问权限解决了该问题。