0

クライアント<->サーバーシステムとして機能するアプリとサービスを作成しています。クライアントはサーバーにデータを送信しており、サーバーはサードパーティのアプリを呼び出しています。これは、サード パーティのアプリがネットワーク ドライブにアクセスする必要があるまで問題なく動作します。サードパーティ ライブラリが呼び出し元 ( LocalService ) からログイン データを継承し、LocalService がドメインの一部でない限り、アプリはネットワーク ドライブにアクセスできません。そのため、クライアントでユーザー ドメイン データを取得しようとし (これは問題ではありませんでした) ProcessInfo、サーバーでプロセスを偽装しようとしましたが、これは失敗しました。ProcessInfo.Username短いGoogle検索の後、Windowsサービスでおよびを使用できないことがProcessInfo.Passwordわかったので、advapi32関数を使用しましたCreateProcessWithLogonW

public void Exec(string strProcessFilename, string strCommand, DomainUser user)
{
    string @path = Path.GetDirectoryName(strProcessFilename);
    // Declare variables
    PROCESS_INFORMATION pi;

    var si = new STARTUPINFO { wShowWindow = 0 };
    // Initialize structs
    si.cb = Marshal.SizeOf(si);

    // login and start process
    if (CreateProcessWithLogonW(user.UserName, user.Domain, user.Password, 2, strProcessFilename, string.Format("{0} {1}", 0, strCommand), 1536, IntPtr.Zero, @path, ref si, out pi))
    {
        WaitForSingleObject(pi.hProcess, INFINITE);
        //var process = Process.GetProcessById(pi.dwProcessId);
        //process.WaitForExit();
    }
    else
    {
        throw new Exception("Failed login error: " + Marshal.GetLastWin32Error());
    }
}

これは正常に動作していますが、サーバー タスク マネージャーを調べると、サードパーティ アプリの新しいプロセスがまだ「ユーザー名」=「ローカル サービス」で実行されていることがわかります。プロセスは現在、指定されたログイン データで「偽装」されていますか?

4

1 に答える 1

0

そのための解決策を見つけました。

私は dwLogonFlags を 2 に設定しました。これは LOGON_NETCREDENTIALS_ONLY を意味します。これを行うと、このユーザーのように振る舞うだけですが、電話をかけるとEnvironment.UserName発信者を取得します。今、私は LOGON_WITH_PROFILE に切り替えたので、システムはドメインからホール ユーザーをダウンロードしています...これには最初の使用時に少し時間がかかりますが、プロセスは完全に偽装されています。

于 2014-04-03T08:34:24.087 に答える