2013-08-30 184 views
3

我编写了一个程序,使用C#中的ManagementObject自动卸载一些程序。它工作正常,除了某些程序会自动重新启动计算机,并且这会破坏我程序的目的。有没有什么办法可以让它等到一切都完成卸载重新启动?如何在不重新启动的情况下卸载程序

这里是实际卸载程序的方法:

static void UninstallProduct(string path) 
{ 
    ManagementObject product = new ManagementObject(path); 

    if ((product != null) && (product.Path.ClassName == "Win32_Product")) 
    { 
    Console.WriteLine(
     "Uninstalling: " 
     + product.GetPropertyValue("Name") 
     + "..."); 

    object result = product.InvokeMethod("Uninstall", null); 
    Console.WriteLine(
     "The Uninstall method result is {0}", 
     result.ToString()); 
    } 
} 
+0

我对ManagementObject类不熟悉,所以我没有把它写成实际的答案。在使用Windows Installer之后,我建议您看看是否有一个标志告诉对象不要让安装程序重新启动系统,并且如果有可以在返回值中查找的标志,告诉您安装需要重启完成。这就是Windows Installer的工作原理。然后,一旦所有程序都被卸载,如果需要重新启动,则可以强制系统重新启动。 – RobH

回答

5

尝试使用REMOVE=ALLREBOOT=ReallySuppress选项调用MSI(安装程序包)。

如果产品使用自定义安装程序而不是使用MSI,则可能没有跳过重新引导的选项。在这种情况下,我会联系开发人员,并指出未经管理员同意重新启动计算机可能会构成拒绝服务攻击:干扰计算设备的运行并故意阻碍或延迟电子通信,这是州和联邦的犯罪行为。如果你是“帮助他们避免责任”,而不是用法律和起诉威胁殴打他们,你可能会得到所需的行为改变(至少在未来的版本中)。

+0

有什么办法可以让我看一个调用MSI安装包的例子吗?这看起来像我需要做的,因为没有参数的Win32产品卸载方法(http://msdn.microsoft.com/en-us/library/windows/desktop/aa393941(v=vs.85) )的.aspx)。 –

+0

@Landon:有一个'MSIInstallProduct'功能看起来很容易使用。您的困难将从WMI对象获取到MSI文件路径,部分原因是不是每个已安装的应用程序都使用MSI。 –

+0

@LandonHammond:尝试使用安装或配置方法,而不是选择?即使使用安装方法,REMOVE = ALL REBOOT = R也应该使其卸载。 –

1

请参阅.NET won't invoke method with command line args了解为什么当您认为REBOOT = ReallySuppress可能无法传递给MSI卸载程序时。我在卸载过程中强制不重新启动的工作是在调​​用MSI卸载方法之前终止您希望卸载的应用程序的所有进程。当然,该解决方法并非万无一失,取决于正在卸载的程序。

相关问题