C# 使用c安装Msi文件#

C# 使用c安装Msi文件#,c#,asp.net,windows-installer,C#,Asp.net,Windows Installer,我正在尝试使用asp.net应用程序插入msi文件。当我在管理员模式下运行VisualStudio时,它工作正常,但当我在正常模式下运行时,它不工作。 我尝试了以下代码: string installerFilePath; installerFilePath = @"D:\ActivexPractice\test\test\NewFolder1\setup.msi"; System.Diagnostics.Process installerProcess = System.Diagnostics

我正在尝试使用asp.net应用程序插入msi文件。当我在管理员模式下运行VisualStudio时,它工作正常,但当我在正常模式下运行时,它不工作。 我尝试了以下代码:

string installerFilePath;
installerFilePath = @"D:\ActivexPractice\test\test\NewFolder1\setup.msi";
System.Diagnostics.Process installerProcess = System.Diagnostics.Process.Start(installerFilePath, "/q");
有人能在这方面指导我吗
如何在没有管理员权限的情况下安装它

您可以使用msiexec.exe运行安装程序。下面是示例代码

        Process installerProcess = new Process();
        ProcessStartInfo processInfo = new ProcessStartInfo();
        processInfo.Arguments = @"/i  D:\ActivexPractice\test\test\NewFolder1\setup.msi  /q";
        processInfo.FileName = "msiexec";
        installerProcess.StartInfo = processInfo;
        installerProcess.Start();
        installerProcess.WaitForExit();

如果MSI需要管理员权限才能安装,那么它将在UI安装中请求提升。您的/q失败,因为静默安装实际上是静默安装,不会提示提升。请注意,不允许有限用户仅仅因为正在进行安装而违反安全规则

因此,在这种情况下,您的启动过程需要提升,要么以管理员身份运行,要么给它一个requiresAdministrator清单,以便它请求提升

当您启动安装时,您需要确保您的提升状态用于启动安装。保证这一点的最简单方法是直接从代码中调用(p/invoke to…)msinstallproduct()。Process.Start的问题是默认情况下ProcessStartInfo.UseShellExecute为true,提升状态(如果有)将不会用于启动安装。启动安装时,它需要是CreateProcess类型的执行,而不是ShellExecute类型,以便使用提升的凭据

private void installMSI(字符串路径) { 字符串[]allFiles=Directory.GetFiles(路径“*.msi”)


如果安装需要管理员权限,那么在创建msi文件时,您什么都不能做。我已将权限授予了所有人,并且它具有完全控制权。msi本身没有任何权限。当然,您可以授予用户执行msi的权限,但msi执行的操作本身可能需要不同的权限。如果安装操作MSI中指定的离子需要管理员权限,然后是运行MSI的用户(或者在本例中是运行调用MSI的C#代码的用户)必须具有执行所有操作所需的权限。我看到此问题被标记为asp.net-您正在尝试让web服务器安装MSI文件吗?为什么要这样做?请不要仅将代码作为答案发布,还要解释您的代码的作用以及它如何解决问题。答案为explanation通常更有用、质量更好,并且更有可能吸引用户投票(与安装在一起的框架)。它是Windows API的托管代码包装器,因此您可以使用漂亮的类编写常规C代码以简化代码。(“部署工具基础”).Core文件:
Microsoft.Deployment.WindowsInstaller.dll
(请参阅上述注释中的源代码链接)…此文件还有一些安装说明。
        foreach (string file in allFiles)
        {
            if(file.Contains("Artis"))
            {
                System.Diagnostics.Process installerProcess = 
                System.Diagnostics.Process.Start(file, "/q");
                while (installerProcess.HasExited == false)
                {
                    installerProcess.WaitForExit();
                }
                Console.WriteLine("Installation done for" + file);
            }
            
        }

    }