0

C++ (Visual Studio 2010) で Windows サービスを作成していますが、このサービスはセキュア コピーを介してリモート サーバーにファイルを送信する必要があります (そのために pscp.exe を使用しています)。

そのため、関数を使用してsystempscp.exe を起動していますが、通常のアプリケーションとして実行するとすべて正常に動作します。

しかし、サービスとして実行しようとすると、サービスは pscp.exe を起動します (これはタスク マネージャーで確認できます) が、pscp.exe はフリーズし、リモート ホストに何も送信しません。また、サービスを停止しても、自分で pscp プロセスを強制終了する必要があります。

サービスが「デスクトップと対話」できるようにするためにいくつかのフォーラムを読みましたが、これで問題は解決しません。

また、サービスがログオンするユーザー アカウントを変更しようとしましたが、結果はありませんでした。

何か案は?

外部プログラムに pscp.exe のような GUI がなくても、Windows サービスから外部プログラムを実行するのは非常に難しいようです。

ありがとう!

-- アウグスト・カリンジ

4

4 に答える 4

0

システムではなく CreateProcess 関数を使用して pscp アプリケーションを起動する必要があります。後者はコマンドをコマンド インタープリター (cmd.exe) に中継しますが、サービスからはアクセスできない可能性があります。

于 2010-12-06T22:41:12.057 に答える
0

なりすましを使おうとするかもしれません。このようなもの...

    wchar_t* cmPath=readRegistryString(L"Software\\" TO_WCHAR(ORG_NAME) L"\\" TO_WCHAR(APP_NAME) L"\\" TO_WCHAR(APPLICATION_GROUP),TO_WCHAR(APPLICATION_EXEC_PATH));
if (!cmPath)
{
    return false;
}
HANDLE userToken=NULL;
DWORD sessId=WTSGetActiveConsoleSessionId ();
if((long)sessId==-1)
{
    sessId=0;
}
WTSQueryUserToken (sessId, &userToken);
bool result=false;
if(userToken/**/ )
{
    SECURITY_ATTRIBUTES sa;
    ZeroMemory(&sa,sizeof(SECURITY_ATTRIBUTES));
    sa.nLength=sizeof(SECURITY_ATTRIBUTES);
    STARTUPINFOW si;
    ZeroMemory(&si,sizeof(STARTUPINFOW));
    si.cb=sizeof(STARTUPINFOW);
    PROCESS_INFORMATION pi;
    ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));
    CStringW str= L"\"";
    str=str+cmPath;
    str=str+L"\"";
    str.Replace(L"/",L"\\");

    if(CreateProcessAsUserW(userToken,NULL,str.GetBuffer(),NULL,NULL,false,NULL,NULL,NULL,&si,&pi))
    {
            result=true;
            CloseHandle(pi.hProcess);
            CloseHandle(pi.hThread);
    }
    else
    {
        DWORD err = GetLastError();
        //nop;
    }
}
if(userToken)
    CloseHandle(userToken);
delete[] cmPath;

このコードは、サービスから GUI アプリケーションを呼び出すために使用しますが、コンソール アプリではそれほど変更する必要はないと思います。

于 2010-12-06T17:33:24.477 に答える
0

pscp呼び出しに関するオプションは何ですか? 「サイレント」オプションがある場合は、それを使用してコンソールとの対話を回避します。多くの場合、これは-qまたは/qです。

起動したアプリは、サービスと同じユーザー アカウントで実行されることに注意してください。そのアカウントには、あなたが求めていることを行う権限がありますか? 必要なことを行うためのコンテキスト (実行ディレクトリ、パス) は正しいpscpですか?

于 2010-12-06T17:12:44.373 に答える
0

問題を修正しました!

pscp.exe は、サービスから実行すると機能しません。どうしてか分かりません。

しかし、curl.exe (libcurl から) はそうであり、安全なコピーをサポートしています!

ありがとう。

于 2010-12-10T11:26:58.640 に答える