静默卸载所有以前的MS Office软件

时间:2015-09-23 13:17:41

标签: ms-access vbscript lync office-2010

我正在尝试默默卸载所有以前的Microsoft软件,以便运行vbscript来安装Office 365(可以​​正常运行)。

这是目前有效的。 使用此处的脚本: https://marckean.wordpress.com/2013/06/18/fully-automate-removal-of-any-version-office-in-preparation-for-office-365/ 从这个链接我用 OffScrub7.vbs& OffScrub10.vbs从理论上卸载了所有Office 2010产品和所有Office 2007产品,但它没有!

运行上面的卸载脚本后,他们仍然会离开Lync 2010和MS Access Database 2007(32位)。

确保卸载所有以前的办公产品的最佳方法,包括OffScrub7.vbs&amp ;;卸载的上述软件。 OffScrub10.vbs?我的猜测是找到无声的vbscripts来卸载Lync 2010和MS Access Database 2007(32位)?

1 个答案:

答案 0 :(得分:0)

可以使用简单的c ++代码和msi api卸载所有Microsoft应用程序。

Req。:win 7 pro 适用于32位和64位操作系统。

一个迷你tool.exe,可以包装在vb脚本,PowerShell等中

UPD:

我有一点空闲时间。 我想补充我的答案。

我谈到了一个小应用程序,但没有显示一行代码。

现在我们将纠正此事。

1)需要Win7 Pro,64位或32位,没关系。 我们要编译32位编译器的项目,因为我们的应用程序需要在32位和64位操作系统上运行。

2)需要任何Ide,我建议Code :: Blocks。

3)需要mingv32-w64编译器 - 更多信息 - mingw-w64.org

3.1)即使您有32个作为主机运行,也必须为64位和32位操作系统安装两个版本的编译器。我们需要一个64位编译器安装的静态库。

4)创建一个控制台应用程序

5)为项目构建选项 - 添加静态库项目libmsi.a

但是!在32位安装的编译器中只有头文件mhi.n,但库本身不是! 但它是64位版本的安装程序。 在64位编译器安装的Lib文件夹中找到此静态库。

6)代码 - 枚举应用程序(来源:http://mariusbancila.ro/blog/2011/05/01/finding-installed-applications-with-vc/

必须以管理员权限运行该实用程序。

也就是说,如果我们从powershell脚本运行该实用程序,那么应该使用管理员权限运行powershell。

#include <iostream>
#include <windows.h>
#include <tchar.h>
#include <msi.h>
#include <string>

using namespace std;

string MsiQueryProperty(LPCTSTR szProductCode,
                     LPCTSTR szUserSid,
                     MSIINSTALLCONTEXT dwContext,
                     LPCTSTR szProperty)
{
    string value;
    DWORD cchValue = 0;
    UINT ret2 = ::MsiGetProductInfoEx(
        szProductCode,
        szUserSid,
        dwContext,
        szProperty,
        NULL,
        &cchValue);
    if(ret2 == ERROR_SUCCESS)
    {
        cchValue++;
        value.resize(cchValue);
        ret2 = ::MsiGetProductInfoEx(
            szProductCode,
            szUserSid,
            dwContext,
            szProperty,
            (LPTSTR)&value[0],
            &cchValue);
    }
    return value;
}

void MsiEnum()
{
    UINT ret = 0;
    DWORD dwIndex = 0;
    TCHAR szInstalledProductCode[39] = {0};
    TCHAR szSid[128] = {0};
    DWORD cchSid;
    MSIINSTALLCONTEXT dwInstalledContext;
    do
    {
        memset(szInstalledProductCode, 0, sizeof(szInstalledProductCode));
        cchSid = sizeof(szSid)/sizeof(szSid[0]);
        ret = ::MsiEnumProductsEx(
            NULL,           // all the products in the context
            _T("s-1-1-0"),  // i.e.Everyone, all users in the system
            MSIINSTALLCONTEXT_USERMANAGED | MSIINSTALLCONTEXT_USERUNMANAGED | MSIINSTALLCONTEXT_MACHINE,
            dwIndex,
            szInstalledProductCode,
            &dwInstalledContext,
            szSid,
            &cchSid);
        if(ret == ERROR_SUCCESS)
        {
            string name = MsiQueryProperty(
                szInstalledProductCode,
                cchSid == 0 ? NULL : szSid,
                dwInstalledContext,
                INSTALLPROPERTY_INSTALLEDPRODUCTNAME);
            string publisher = MsiQueryProperty(
                szInstalledProductCode,
                cchSid == 0 ? NULL : szSid,
                dwInstalledContext,
                INSTALLPROPERTY_PUBLISHER);
            string version = MsiQueryProperty(
                szInstalledProductCode,
                cchSid == 0 ? NULL : szSid,
                dwInstalledContext,
                INSTALLPROPERTY_VERSIONSTRING);
            string location = MsiQueryProperty(
                szInstalledProductCode,
                cchSid == 0 ? NULL : szSid,
                dwInstalledContext,
                INSTALLPROPERTY_INSTALLLOCATION);

            cout << name << endl;
            cout << "  - " << publisher << endl;
            cout << "  - " << version << endl;
            cout << "  - " << location << endl;
            cout << endl;
            dwIndex++;
        }
    }
    while(ret == ERROR_SUCCESS);
}

int main()
{
    MsiEnum();
    return 0;
}

一段时间后将添加代码,代表他删除应用程序,该应用程序显示在控制面板中已安装程序的列表中。

时间不够,伤心=(

但是你可以尝试编写一个应用程序(如果你感兴趣的话,真的没什么特别的,但仍然非常有趣)