我编写了一个程序,使用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 :(得分:5)
尝试使用REMOVE=ALL
和REBOOT=ReallySuppress
选项调用MSI(安装程序包)。
如果产品使用自定义安装程序而不是使用MSI,则可能没有跳过重新启动的选项。在这种情况下,我会联系开发人员,并指出在未经管理员同意的情况下重新启动计算机可能构成拒绝服务攻击:干扰计算设备的操作并故意阻碍或延迟电子通信,这是州和联邦的罪行。如果你“帮助他们避免责任”而不是用法律和起诉威胁击败他们,你可能会得到理想的行为改变(至少在未来的版本中)。
答案 1 :(得分:1)
请参阅.NET won't invoke method with command line args以了解为什么REBOOT = ReallySuppress可能无法在您认为的情况下传递给MSI卸载程序。在卸载过程中强制不重启的有效方法是在调用MSI卸载方法之前终止要卸载的应用程序的所有进程。当然,该解决方法并非万无一失,取决于正在卸载的程序。