提升 MSI 安装,同时允许基于用户的操作

问题描述 投票:0回答:3

是的,有很多与安装 MSI 软件包时提升权限相关的文章。 我对这个问题有一个转折,我找不到一个好的答案。 如果我以用户身份登录并运行 MSI 提升代码(如下),则会安装 软件包,但 当前用户操作是在我提升安装程序所使用的用户上执行的。
例如,如果 MSI 将文件添加到当前用户的桌面。 提升(以“Joe Admin”身份运行)的结果是文件被放置在 Joe Admin 的桌面上,而不是当前登录的用户(“Sally User”)。 我拥有一个软件,该软件可以作为 Joe 进行提升,但会将文件放在 Sally 的桌面上,就像她安装了它一样。 -我想自己写一个。 这是在 Windows 7 计算机上,UAC 已关闭。

这是非工作代码。 (Sally 已登录,Elevate as 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;
    }
c# process windows-installer user-profile elevation
3个回答
1
投票

从提升的进程调用

msiexec /jm foo.msi
来执行广告。 这有利于包。 从标准用户进程调用
msiexec /I foo.msi REBOOT=R /qb
,这将以用户身份启动安装,但根据需要无缝升级。 标准操作和无模拟的自定义操作将以 SYSTEM 身份运行,具有模拟的自定义操作将以没有设计权限的用户身份运行。


1
投票

在克里斯托弗·佩因特的帮助下,这似乎就是答案(感谢克里斯托弗!!!) 我以前读过“做广告”这个词,一直以为它与“在 GPO 中发布”有关,所以我从未仔细阅读过。 看来我错了。如果其他人遇到这个问题,这是技巧。

首先,以提升的权限进行广告,以“祝福”msi 进行最终用户安装。 在我看来,管理员会说,确保 Sally 最终用户安装此 msi 是安全的:

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;
    }

0
投票

我看到我们的客户报告的一些问题可能是由于遵循此操作而导致的,尽管我尚未找到证据并且无法直接进行故障排除。

但我发现应用程序无法通过 Intune(适用于 AVD 的 Microsoft 远程桌面客户端)更新,因为它的先前版本已被宣传。但是,由于 Intune 不维护持久缓存,因此所公布的 MSI 的源不可用,因此 RemoveExistingProducts 失败。 MSI 日志将提到“基于现有产品,将功能设置为‘广告’状态”,然后不久之后,“无法解析源”。

此应用程序没有设置 ALLUSERS,但强制执行了 UAC,这种设置可能会让以前的管理员寻找并尝试此处概述的解决方案,以尝试将其安装在用户上下文中。

对于遇到此问题的其他人,我建议采用以下解决方案:

  1. 获取之前的 MSI 并运行此命令以在删除之前重新缓存:

msiexec /x 文件名.msi /qb 重新安装模式=v

  1. 如果失败,请使用 MsiZap 将其从轨道上炸掉:

msizap.exe 台湾! {产品代码}

© www.soinside.com 2019 - 2024. All rights reserved.