はい、MSI パッケージをインストールする際のアクセス許可の昇格に関連する記事が多数あります。私は良い答えを見つけることができないという問題にひねりを加えています。ユーザーとしてログインし、MSI 昇格コード (下記) を実行すると、パッケージはインストールされますが、現在のユーザー アクションは、インストーラーを昇格したユーザーで実行されます。
たとえば、MSI が CURRENT USER のデスクトップにファイルを追加するとします。昇格 (「Joe Admin」として実行) の結果、現在ログインしているユーザー (「Sally User」) ではなく、Joe Admin のデスクトップにファイルが配置されます。私は Joe として昇格するソフトウェアを所有していますが、Sally がインストールしたかのようにファイルを Sally のデスクトップに置きます。・自分で書きたい。これは Windows 7 マシン上にあり、UAC はオフになっています。
これが非動作コードです。(Sally がログインし、Joe として昇格 - ファイルが Joe のデスクトップに移動) (LoadUserProfile プロパティは、この問題を解決するための試みでした - 機能しませんでした)。
Process watchThis = ImpersonateInstaller(@"c:\temp\Test.msi", "SuperJoePassword");
watchThis.WaitForExit();
private static Process ImpersonateInstaller(string msiPath, string Password)
{
Domain d = Domain.GetCurrentDomain();
Process process = new Process();
process.StartInfo.UseShellExecute = false;
process.StartInfo.LoadUserProfile = true;
process.StartInfo.FileName = @"C:\Windows\System32\msiexec.exe";
process.StartInfo.Arguments = string.Format(@"/i {0} REBOOT=ReallySuppress /qb-", msiPath);
process.StartInfo.WorkingDirectory = Environment.GetEnvironmentVariable("WINDIR");
process.StartInfo.UserName = "JoeAdmin";
process.StartInfo.Password = new SecureString();
process.StartInfo.Domain = d.ToString();
foreach (char c in Password.ToCharArray())
{
process.StartInfo.Password.AppendChar(c);
}
process.Start();
return process;
}