クライアント<->サーバーシステムとして機能するアプリとサービスを作成しています。クライアントはサーバーにデータを送信しており、サーバーはサードパーティのアプリを呼び出しています。これは、サード パーティのアプリがネットワーク ドライブにアクセスする必要があるまで問題なく動作します。サードパーティ ライブラリが呼び出し元 ( 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());
}
}
これは正常に動作していますが、サーバー タスク マネージャーを調べると、サードパーティ アプリの新しいプロセスがまだ「ユーザー名」=「ローカル サービス」で実行されていることがわかります。プロセスは現在、指定されたログイン データで「偽装」されていますか?