更新是标识的可用于实现自定义控件编码的用户界面测试扩展模型,Visual Studio 2010 SP1 中的修补程序:

文章翻译 文章翻译
文章编号: 2696646 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

使用 Microsoft Visual Studio 2010 Service Pack 1 (SP1) 的更新。此更新可添加新的扩展模型时您录制和运行自动化测试 Visual Studio 2010 SP1 中使用的编码用户界面测试扩展模型启用自定义控件的标识。在应用此更新后,插件为自定义控件的新实现是简单得多,比之前更简单。

新的扩展模型中添加以下类:
  • UITechnologyElementProxy。作为举例说明如何使用此新类,您可以更改QueryID方法。此方法被列为一组图上的用户界面元素 (UIMap) 的条件。要添加更多条件或更改现有条件,您可以使用此新类。这些条件可能是自动化的其他属性。或者,这些条件可用于将层次结构的更多的可用信息添加到现有的 UIMap 文件。
  • UITechnologyManagerProxy。 您可以使用此新类代理技术管理器中注册您的技术经理。

有关如何在应用此更新之后,才能使用这些新类的详细信息,请参阅"更多信息"一节中的方案。

更多信息

方案

方案 1

您尝试通过编码 UI 项测试一切外观良好除外,如自定义的控件的边框或GetHashCode方法的重写中更改的一个或两个小难题测试自定义的控件。与以前的扩展模型,您可以编写插件的要解决此问题,并覆盖目标的方法。但在同一时间,您必须重写其他方法使插件的工作,并且它可能需要几天才能趋于稳定。通过使用新的扩展模型,可以通过重写目标的方法来执行相同的工作。

方案 2

在开发自定义的控件,并确认编码用户界面测试不能自动化的自定义控件的操作。例如,单击只播放回协调编码用户界面测试。通过使用这些新类,您可以实现自定义控件的搜索属性,通过使用编码用户界面测试中执行的九个简单步骤自动执行其操作的扩展模型。

Microsoft 提供的编程示例仅用于说明,没有任何明示或暗示的担保。这包括但不限于对适销性或特定用途适用性的暗示担保。本文假定您熟悉演示的编程语言和用于创建和调试过程的工具。Microsoft 的支持工程师可以帮助解释某个特定过程的功能。但是,它们不会更改这些示例以提供额外的功能或构建过程以满足您的特定要求。
  1. 通过控件的标识属性,例如说明帮助属性 AccessibleObject 类型的可用属性。同样,将其他属性值传递为分隔符分隔的格式字符串中的AccessibleObject属性,如下例所示:

    public override string Description
    {
        get
        {
            return "<custom_property_value1>"+";"+"<custom_property_value2>";
        }
    }

    注意这是一个将附加参数传递给编码用户界面测试的方法。如果您有多个属性必须公开的您还可以使用的代码注入方法传递自定义属性。一种方法是使用编码用户界面测试和实际的应用程序之间的 WCF 通道。通道可用于通过标识控件或使用自定义属性来执行控件的基本验证所需的属性。将属性传递的另一种方法是使用 Windows 消息。可以确定适当的方法,具体取决于您的要求。

  2. 指定的自定义技术名称 UITechnologyManagerProxy类和相应的核心技术管理器的名称,以便编码用户界面测试扩展框架可以相应地执行内部代理注册。

    注意目前,第三方插件不能作为任何编码用户界面测试核心技术名称中使用相同的技术名称。另外,多个第三方插件名称不能发生冲突。尽管插件加载的扩展管理器,编码的用户界面测试插件管理器不能允许的多个插件具有重复的技术名称的注册。因此,自定义的控件必须注册针对不同的技术名称中的CustomTechnologyManager构造函数,如在下面的示例:
    public CustomTechnologyManager()
                : base("MSAA", "<custom_technology_name>")
            {
            }
  3. 重写的GetControlSupportLevel方法 UITechnologyManagerProxy类。您可以获得的 AccessibleObject 类型从windowHandle属性,如下例所示。执行此操作后,它将成为自定义属性中提取相当容易。然后,可以返回适当的支持级别从自定义插件后其进行验证的自定义属性值。
    internal enum OBJID : uint
            {
                WINDOW = 0x00000000,
                SYSMENU = 0xFFFFFFFF,
                TITLEBAR = 0xFFFFFFFE,
                MENU = 0xFFFFFFFD,
                CLIENT = 0xFFFFFFFC,
                VSCROLL = 0xFFFFFFFB,
                HSCROLL = 0xFFFFFFFA,
                SIZEGRIP = 0xFFFFFFF9,
                CARET = 0xFFFFFFF8,
                CURSOR = 0xFFFFFFF7,
                ALERT = 0xFFFFFFF6,
                SOUND = 0xFFFFFFF5,
            }
     
    internal static IAccessible AccessibleObjectFromWindow(IntPtr windowHandle)
            {
                Guid accessibleGuid = typeof(IAccessible).GUID;
                IAccessible accessible = null;
     
                if (AccessibleObjectFromWindow(windowHandle, (int)OBJID.WINDOW, ref accessibleGuid, ref accessible) != 0)
                {
                    Trace.TraceError("AccessibleObjectFromWindow failed for window handle {0}", windowHandle);
                }
     
                return accessible;
            }
     
     
           [DllImport("oleacc.dll")]
    internal static extern int AccessibleObjectFromWindow(IntPtr hWnd, int dwObjectID, ref Guid riid, ref IAccessible pAcc);
     
    public override int GetControlSupportLevel(IntPtr windowHandle)
            {
                int supportLevel = base.GetControlSupportLevel(windowHandle);
                if (supportLevel > 1)
                {
                    IAccessible accessibleObject = this.AccessibleObjectFromWindow(windowHandle);
                    if (accessibleObject!=null && accessibleObject.accDescription.Contains("custom_property_value"))
                    {
                        return (int)ControlSupport.ControlSpecificSupport;
                    }
                }
     
                return (int)ControlSupport.NoSupport;
            }
  4. 将自定义属性添加到中的QueryID方法 UITechnologyElementProxy类。您可以添加的附加条件或删除的QueryID方法中的条件。注意一旦删除了某个条件,属性条件将出现在 UIMap 中。添加的附加条件后,将列在.uitest 文件中生成的代码的属性条件的其他标记为执行任何操作时该自定义控件,如下例所示:
    <PropertyCondition Name=" <Custom_property_name>">Custom_property_value</PropertyCondition>
     
            public override IQueryElement QueryId
            {
                get 
                {
                    if (queryElement == null)
                    {
                        queryElement = base.QueryId;
                        if(string.Equals(this.ControlTypeName, ControlType.Button.ToString(), StringComparison.OrdinalIgnoreCase))
                        {
                            Utilities.UpdateQueryId(this, queryElement, new string[] 
                            {
                                <Custom_property_name>
                        });
                        }
                    }
                    return queryElement;
                }
            }


    以下是如何实现的Utilities.UpdateQueryId方法的示例。在前面的示例使用此方法。
    internal static void UpdateQueryId(UITechnologyElement element, IQueryElement queryElement, string[] inclusionProperties)
            {
                List<IQueryCondition> conditionList = new List<IQueryCondition>(queryElement.Condition.Conditions);
                if (conditionList != null)
                {
                    bool updated = false;
                    foreach (string propertyToInclude in inclusionProperties)
                    {
                        bool exists = false;
                        foreach (IQueryCondition qCond in conditionList)
                        {
                            PropertyCondition pCond = qCond as PropertyCondition;
                            if (pCond != null &&
                                string.Equals(pCond.PropertyName, propertyToInclude, StringComparison.OrdinalIgnoreCase))
                            {
                                exists = true;
                                break;
                            }
                        }
     
                        if (!exists)
                        {
                            string propVal = element.GetPropertyValue(propertyToInclude) as string;
                            PropertyCondition newCondition = new PropertyCondition(propertyToInclude, propVal);
                            conditionList.Add(newCondition);
                            updated = true;
                        }
                    }
     
                    if (updated)
                    {
                        queryElement.Condition.Conditions = conditionList.ToArray();
                    }
                }
            }
  5. 重写的GetPropertyValue方法 UITechnologyElementProxy类,然后将值设置为说明字符串中的第一个标记。此实现将根据您传递自定义属性的方式会有所不同。如果您使用代码注入传递属性,应创建一个通道,然后从主机,按照下面的示例获取属性:
    public override object GetPropertyValue(string propertyName)
    {
        if (string.Equals(propertyName, “<custom_property_name>”))
        {
            string accDesc = this.GetPropertyValue(<custom_property_name>) as string;
            if (accDesc != null)
            {
                string[] descriptionTokens = accDesc.Split(new char[] { ';' });
                return descriptionTokens[0];
            }
        }
        return base.GetPropertyValue(propertyName);
    }
  6. 指定自定义技术管理器中 UITechnologyElementProxy类,然后将其关联以及核心 IUI 技术元素,如下例所示:
    public RadGridViewTechnologyElement(CustomTechnologyManager technologyManager, IUITechnologyElement coreElement)
                : base(technologyManager, coreElement)
            {
            }
  7. 如果您有一个专用的类为自定义的代码生成,并添加其他属性条件的QueryID方法中第 4 步中所述,您必须公开自定义属性作为有效的搜索属性对于此元素,如下例所示:
    protected override Dictionary<string, bool> GetValidSearchProperties()
    {
        Dictionary<string, bool> validSearchProperties = base.GetValidSearchProperties();
        if (!validSearchProperties.ContainsKey(<custom_property_name>))
        {
            validSearchProperties.Add((<custom_property_name>, true);
        }
     
        return validSearchProperties;
    }
  8. 在扩展名为PropertyProvider ,通过添加条件来设置控件的支持级别,如下例所示。

    注意当检索的uiTestControl方法的属性时,我们建议您使用可在SearchProperties属性或uiTestControl方法的FilterProperties属性中的那些属性。不要试图获取任何附加属性,因为实时控件可能无法使用代码生成过程中。
    public override int GetControlSupportLevel(UITestControl uiTestControl)
            {
                if (IsSupported(uiTestControl))
                {
                    return (int)ControlSupport.ControlSpecificSupport;
                }
     
                return (int)ControlSupport.NoSupport;
            }
     
    private static bool IsSupported(UITestControl uiTestControl)
            {
                string accDescriptionValue = string.Empty;
                string objectType = string.Empty;
     
                if (uiTestControl.SearchProperties != null && uiTestControl.SearchProperties.Count > 0)
                {
                    PropertyExpression controlTypeExpression = uiTestControl.SearchProperties.Find(“<Custom_property_name>”);
                    if (controlTypeExpression != null)
                    {
                        accDescriptionValue = controlTypeExpression.PropertyValue;
                        string[] descriptionTokens = accDescriptionValue.Split(new char[] { ';' });
                        objectType = descriptionTokens[0];
                    }
                }
     
                if (string.Equals(uiTestControl.TechnologyName, “<Custom_technology_name>”, StringComparison.OrdinalIgnoreCase)
                     && (objectType.Contains(“<Custom_property_value>”)))
                 
                {
     
                    return true;
                }
                return false;
            }
  9. 实现UITestExtensionPackage方法,并将附加的 PropertyProvider 和 TechnologyManager 服务,通过重写GetService方法,如下面的示例:
    public override object GetService(Type serviceType)
    {
        Trace.WriteLine("RadGridViewExtensionPackage.GetService(" + serviceType.ToString() + ")");
        if (serviceType == typeof(UITestPropertyProvider))
            return this.PropertyProvider;
        else if (serviceType == typeof(UITechnologyManager))
            return this.TechnologyManager;
        return null;
    }

更新信息

可以从 Microsoft 获得支持的修补程序。但是,此修补程序用于解决本文中描述的问题。此修补程序仅适用于系统遇到本文中描述的问题。此修补程序可能会接受进一步的测试。因此,如果这个问题没有对您造成严重的影响,我们建议您等待包含此修补程序的下一个软件更新。

如果此修复程序可供下载,没有在此知识文库文章顶部"提供修补程序下载"部分。如果此部分不会出现,请与 Microsoft 客户服务和支持,以获取此修复程序。

注意如果出现其他问题或是否需要任何故障诊断,您可能必须创建一个单独的服务请求。将正常收取费用将应用于其他支持问题和事项,不为此特定的修补程序。有关的 Microsoft 客户服务和支持电话号码,或创建单独的服务请求的完整列表,请访问以下 Microsoft 网站:
http://support.microsoft.com/contactus/?ws=support
注意在"可用的修补程序下载"窗体显示修补程序所用的语言。如果您看不到您的语言,这是因为修补程序不能用于该语言。

系统必备组件

若要应用此修补程序,必须具有 Service Pack 1 (SP1) 应用于以下内容之一:
  • Microsoft Visual Studio 2010年特优
  • Microsoft Visual Studio 2010年终极
  • Microsoft Visual Studio 2010年测试专业
  • Microsoft Visual Studio Team Foundation Server 2010
  • Microsoft Visual Studio 测试代理 2010

有关如何获取 Visual Studio 2010 SP1 的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
983509 Visual Studio 2010 Service Pack 1 的说明

重新启动信息

必须在应用此修补程序后,重新启动计算机。我们建议您在应用此修补程序之前退出 Visual Studio 的任何实例。

修补程序替换信息

此修补程序不替代以前发布的修补程序。

文件信息

此修补程序安装具有下表中列出的属性的文件。日期和时间,这些文件列出了以协调通用时间 (UTC)。在您的本地时间与当前夏令时 (DST) 偏差一起显示的日期和时间在您的本地计算机上的这些文件。此外,日期和时间可能更改执行某些操作的文件。
收起该表格展开该表格
文件名称文件版本文件大小日期时间平台
Leviewer.exe10.0.40219.396118,3442012 年 4 月 28 日18: 41x86
Microsoft.teamfoundation.build.client.dll10.0.40219.396436,3522012 年 4 月 27 日7: 59x86
Microsoft.teamfoundation.build.controls.dll10.0.40219.3961,365,1282012 年 4 月 28 日18: 41x86
Microsoft.teamfoundation.client.dll10.0.40219.3961,595,5122012 年 4 月 27 日7: 59x86
Microsoft.teamfoundation.common.dll10.0.40219.396525,4322012 年 4 月 27 日7: 59x86
Microsoft.teamfoundation.common.library.dll10.0.40219.396334,9842012 年 4 月 27 日7: 59x86
Microsoft.teamfoundation.controls.dll10.0.40219.396938,6162012 年 4 月 28 日18: 41x86
Microsoft.teamfoundation.dll10.0.40219.396675,4322012 年 4 月 27 日7: 59x86
Microsoft.teamfoundation.lab.activities.dll10.0.40219.396772,7442012 年 4 月 28 日18: 41x86
Microsoft.teamfoundation.lab.client.dll10.0.40219.396153,2162012 年 4 月 27 日7: 59x86
Microsoft.teamfoundation.lab.uiutils.dll10.0.40219.396266,8802012 年 4 月 28 日18: 41x86
Microsoft.teamfoundation.lab.workflow.activities.dll10.0.40219.396440,4722012 年 4 月 28 日18: 41x86
Microsoft.teamfoundation.officeintegration.common.dll10.0.40219.396375,9682012 年 4 月 28 日18: 41x86
Microsoft.teamfoundation.officeintegration.project.dll10.0.40219.396517,2802012 年 4 月 28 日18: 41x86
Microsoft.teamfoundation.sync.mapping.dll10.0.40219.39672,3202012 年 4 月 28 日18: 41x86
Microsoft.teamfoundation.sync.provisioning.dll10.0.40219.396194,1922012 年 4 月 28 日18: 41x86
Microsoft.teamfoundation.testmanagement.activities.common.dll10.0.40219.396315,0562012 年 4 月 28 日18: 41x86
Microsoft.teamfoundation.testmanagement.activities.dll10.0.40219.3961,512,0962012 年 4 月 28 日18: 41x86
Microsoft.teamfoundation.testmanagement.activityruntime.dll10.0.40219.396219,8162012 年 4 月 28 日18: 41x86
Microsoft.teamfoundation.testmanagement.client.dll10.0.40219.396685,2082012 年 4 月 27 日7: 59x86
Microsoft.teamfoundation.testmanagement.client.themes.dll10.0.40219.3963,059,3682012 年 4 月 28 日18: 41x86
Microsoft.teamfoundation.testmanagement.client.wpfcontrols.dll10.0.40219.396257,7122012 年 4 月 28 日18: 41x86
Microsoft.teamfoundation.testmanagement.clientpackage.dll10.0.40219.39673,8962012 年 4 月 28 日18: 41x86
Microsoft.teamfoundation.testmanagement.common.dll10.0.40219.39634,4562012 年 4 月 27 日7: 59x86
Microsoft.teamfoundation.testmanagement.controller.dll10.0.40219.396120,9922012 年 4 月 28 日18: 41x86
Microsoft.teamfoundation.testmanagement.controls.dll10.0.40219.396496,2802012 年 4 月 28 日18: 41x86
Microsoft.teamfoundation.testmanagement.controls.wpfworkitemcontrols.dll10.0.40219.396100,0402012 年 4 月 28 日18: 41x86
Microsoft.teamfoundation.versioncontrol.client.dll10.0.40219.396706,2002012 年 4 月 27 日7: 59x86
Microsoft.teamfoundation.versioncontrol.common.dll10.0.40219.396233,1122012 年 4 月 27 日7: 59x86
Microsoft.teamfoundation.versioncontrol.controls.dll10.0.40219.3964,439,1922012 年 4 月 28 日18: 41x86
Microsoft.teamfoundation.workitemtracking.client.dll10.0.40219.396699,0322012 年 4 月 27 日7: 59x86
Microsoft.teamfoundation.workitemtracking.controls.dll10.0.40219.3961,215,1362012 年 4 月 28 日18: 41x86
Microsoft.teamfoundation.workitemtracking.proxy.dll10.0.40219.396390,8082012 年 4 月 27 日7: 59x86
Microsoft.visualstudio.qualitytools.agentobject.dll10.0.40219.396106,6482012 年 4 月 28 日18: 41x86
Microsoft.visualstudio.qualitytools.common.dll10.0.40219.3961,355,4082012 年 4 月 28 日18: 41x86
Microsoft.visualstudio.qualitytools.controllerobject.dll10.0.40219.396276,1282012 年 4 月 28 日18: 41x86
Microsoft.visualstudio.qualitytools.datacollectionagentobject.dll10.0.40219.39637,0482012 年 4 月 28 日18: 41x86
Microsoft.visualstudio.qualitytools.executioncommon.dll10.0.40219.396481,4402012 年 4 月 28 日18: 41x86
Microsoft.visualstudio.qualitytools.resource.dll10.0.40219.396966,8002012 年 4 月 28 日18: 41x86
Microsoft.visualstudio.qualitytools.testcasemanagement.dll10.0.40219.3961,280,1682012 年 4 月 28 日18: 41x86
Microsoft.visualstudio.qualitytools.tmi.dll10.0.40219.396398,4722012 年 4 月 28 日18: 41x86
Microsoft.visualstudio.teamfoundation.build.dll10.0.40219.396142,4802012 年 4 月 28 日18: 41x86
Microsoft.visualstudio.teamfoundation.dll10.0.40219.39693,8242012 年 4 月 28 日18: 41x86
Microsoft.visualstudio.teamfoundation.teamexplorer.dll10.0.40219.396799,9042012 年 4 月 28 日18: 41x86
Microsoft.visualstudio.teamfoundation.versioncontrol.dll10.0.40219.39659,0482012 年 4 月 28 日18: 41x86
Microsoft.visualstudio.teamfoundation.versioncontrol.dll10.0.40219.39659,5602012 年 4 月 28 日18: 41x86
Microsoft.visualstudio.teamfoundation.versioncontrol.dll10.0.40219.39661,0962012 年 4 月 28 日18: 41x86
Microsoft.visualstudio.teamfoundation.versioncontrol.dll10.0.40219.39663,6562012 年 4 月 28 日18: 41x86
Microsoft.visualstudio.teamfoundation.versioncontrol.dll10.0.40219.396942,2402012 年 4 月 28 日18: 41x86
Microsoft.visualstudio.teamfoundation.workitemtracking.dll10.0.40219.396460,9682012 年 4 月 28 日18: 41x86
Microsoft.visualstudio.teamsystem.integration.dll10.0.40219.396193,1762012 年 4 月 28 日18: 41x86
Microsoft.visualstudio.testtools.manualtest.common.dll10.0.40219.396813,2162012 年 4 月 28 日18: 41x86
Microsoft.visualstudio.testtools.uitest.codegeneration.dll10.0.40219.396155,3042012 年 4 月 28 日18: 41x86
Microsoft.visualstudio.testtools.uitest.extension.dll10.0.40219.396193,6962012 年 4 月 28 日18: 41x86
Microsoft.visualstudio.testtools.uitest.extension.ie.dll10.0.40219.396252,0642012 年 4 月 28 日18: 41x86
Microsoft.visualstudio.testtools.uitest.extension.msaa.dll10.0.40219.396115,3682012 年 4 月 28 日18: 41x86
Microsoft.visualstudio.testtools.uitest.extension.uia.dll10.0.40219.396107,1762012 年 4 月 28 日18: 41x86
Microsoft.visualstudio.testtools.uitest.framework.dll10.0.40219.39658,0162012 年 4 月 28 日18: 41x86
Microsoft.visualstudio.testtools.uitest.playback.dll10.0.40219.39666,2002012 年 4 月 28 日18: 41x86
Microsoft.visualstudio.testtools.uitest.recorder.dll10.0.40219.396230,0402012 年 4 月 28 日18: 41x86
Microsoft.visualstudio.testtools.uitesting.dll10.0.40219.396339,6002012 年 4 月 28 日18: 41x86
Msdiff.dll10.0.40219.396485,4482012 年 4 月 28 日18: 41x86
Mtm.exe10.0.40219.396449,0882012 年 4 月 28 日18: 41x86
Qtagent.exe10.0.40219.39621,0642012 年 4 月 28 日18: 41x86
Qtagent.exe10.0.40219.39621,0722012 年 4 月 28 日18: 41x86
Qtagent32.exe10.0.40219.39621,0642012 年 4 月 28 日18: 41x86
Qtagent32.exe10.0.40219.39621,0722012 年 4 月 28 日18: 41x86
Qtagentservice.exe10.0.40219.39699,9282012 年 4 月 28 日18: 41x86
Rpfplayback.dll10.0.40219.396482,4722012 年 4 月 28 日18: 41x86
Tf.exe10.0.40219.396325,6962012 年 4 月 28 日18: 41x86


参考

有关软件更新术语的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
824684 用来描述 Microsoft 软件更新的标准术语的说明

属性

文章编号: 2696646 - 最后修改: 2012年5月23日 - 修订: 1.0
这篇文章中的信息适用于:
  • Microsoft Visual Studio 2010 Service Pack 1?当用于
    • Microsoft Visual Studio 2010 Ultimate
    • Microsoft Visual Studio 2010 Premium with MSDN
    • Microsoft Visual Studio Test Professional 2010
    • Microsoft Visual Studio Team Foundation Server 2010
    • Microsoft Visual Studio Agents 2010
关键字:?
kbautohotfix kbqfe kbhotfixserver kbfix kbbug kbexpertiseinter kbsurveynew kbmt KB2696646 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 2696646
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com