0

ローカル (リモート) データベースをサーバー上の集中型統合データベース (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 によってトリガーされると、ログ ファイルに次のエラー メッセージが表示されます。

ログファイル:

I. 2013-04-11 11:17:11。"BTI"
I. 2013-04-11 11:17:11 にメッセージを送信しています。soopen "\\IPaddress\Databases\Production\messages\consolid\Rem00005.g" 失敗 1326: 無効な引数
I. 2013-04-11 11:17:11。soopen "\\IPaddress\Databases\Production\messages\consolid\Rem00005.h" 失敗 1326: 無効な引数
I. 2013-04-11 11:17:13. soopen "\\IPaddress\Databases\Production\messages\consolid\Rem00005.i" 失敗 1326: 無効な引数
I. 2013-04-11 11:17:13。soopen "\\IPaddress\Databases\Production\messages\consolid\Rem00005.j" 失敗 1326: 無効な引数
I. 2013-04-11 11:17:13. soopen "\\IPaddress\Databases\Production\messages\consolid\Rem00005.k" 失敗 1326: 無効な引数
E. 2013-04-11 11:17:
I. 2013-04-11 11:17:13。再送信要求がキューに入れられています
I. 2013-04-11 11:17:14. 実行完了

"\\IP address\Databases\Production\messages\consolid" は、リモート マシンからのメッセージがコピーされるサーバー上のフォルダーです。

これについてあなたの助けを求めます。コマンド プロンプトからは同期でき、'CreateProcessAsUser' からは同期できないのはなぜですか? プロセスがサーバー上の上記のパスにメッセージを送信できないのはなぜですか。

私がすでに試したいくつかのこと:

  1. Windows ドメイン名と資格情報を使用して、コードで ::LogonUser() を使用してアプリにログインしています。有効な資格情報を送信していることを再確認しました。

  2. エクスプローラーを使用して、サーバー上の上記のパスに正常に移動し、ファイルを追加/削除できます。

  3. [管理ツール] >> [ローカル セキュリティ ポリシー] の下の [ローカル セキュリティ設定] にユーザー ID を追加しました。

任意の提案をいただければ幸いです。

4

1 に答える 1

1

その答えを見つけることができました。私のリモート データベースと統合データベースは、異なるドメインに属する 2 つの異なるマシン上にありました。リモート データベースにログインしていたユーザーが、統合マシンのフォルダにアクセスできませんでした。統合マシンへのアクセス権をユーザーに付与すると、問題が解決しました。

于 2013-04-16T21:49:51.187 に答える