0

はい、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;
    }
4

2 に答える 2

1

msiexec /jm foo.msiアドバタイズを実行する昇格されたプロセス呼び出しから。これはパッケージを祝福します。標準のユーザープロセス呼び出しmsiexec /I foo.msi REBOOT=R /qbから、これによりユーザーとしてインストールが開始されますが、必要に応じてシームレスに昇格します。偽装なしの標準アクションとカスタム アクションは SYSTEM として実行され、偽装付きカスタム アクションは設計どおりの特権なしでユーザーとして実行されます。

于 2013-08-29T18:47:04.807 に答える
0

Christopher Painter の助けを借りて、これが答えのようです (THANKS CHRISTOPHER!!!) 私は以前に「広告」という言葉を読んだことがあり、「GPO での公開」と関係があると常に思っていたので、フォローすることはありませんでした。私が間違っているようです。他の誰かがこれに出くわした場合のトリックは次のとおりです。

まず、エンド ユーザーのインストール用に msi を "祝福" する権限を昇格してアドバタイズします。私の考えでは、管理者は、この msi が Sally エンド ユーザーがインストールしても安全であることを確認してください。

msiexec.exe /jm install.msi

次に、管理者であるかのようにエンド ユーザーとしてインストールします。

msiexec.exe /i install.msi /your /typcial /installOption /switches /here

私のコード(確かにもっと良いかもしれません):

        Process advertise = advertiseMSI(@"c:\temp\test.msi", "JoeWhoHasAdminRights", "Joe'sSuperPassword");
        advertise.WaitForExit();
        Process install = installMSI(@"c:\temp\test.msi");
        install.WaitForExit();


    private static Process advertiseMSI(string msiPath, string userName, string Password)
    {
        Domain domain = Domain.GetCurrentDomain();
        Process process = new Process();
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.FileName = @"C:\Windows\System32\msiexec.exe";
        process.StartInfo.Arguments = string.Format(@"/jm {0}", msiPath);
        process.StartInfo.WorkingDirectory = Environment.GetEnvironmentVariable("WINDIR");
        process.StartInfo.UserName = userName;
        process.StartInfo.Password = new SecureString();
        foreach (char c in Password.ToCharArray())
        {
            process.StartInfo.Password.AppendChar(c);
        }
        process.StartInfo.Domain = domain.ToString();            
        process.Start();
        return process;
    }

    private static Process installMSI(string msiPath)
    {
        Process process = new Process();
        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.Start();
        return process;
    }
于 2013-08-30T14:37:11.957 に答える