首页 文章

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

提问于
浏览
0

我试图默默卸载所有以前的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和OffScrub10.vbs未卸载的上述软件?我的猜测是找到无声的vbscripts来卸载Lync 2010和MS Access Database 2007(32位)?

1 回答

  • 0

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

    要求: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;
    }
    

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

    只是没有足够的时间,悲伤=(

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

相关问题