为C#查找Microsoft.Windows.ServerManager库

时间:2014-08-06 14:30:37

标签: c# .net windows powershell

我正在使用System.Management.Automation命名空间,以便在C#.NET程序中使用powershell。

但是,根据http://technet.microsoft.com/en-us/library/ee662309.aspx Add-WindowsFeature返回Microsoft.Windows.ServerManager.Commands.FeatureOperationResult类型。

此对象在MSDN上未记录,但我能够使用PowerShell和Get-Member命令检索其成员。

PS C:\Users\Administrator> $RES[0] | Get-Member


   TypeName: Microsoft.Windows.ServerManager.Commands.FeatureOperationResult

Name          MemberType Definition
----          ---------- ----------
Equals        Method     bool Equals(System.Object obj)
GetHashCode   Method     int GetHashCode()
GetType       Method     type GetType()
ToString      Method     string ToString()
ExitCode      Property   Microsoft.Windows.ServerManager.Commands.FeatureOperationExitCode ExitCode {get;}
FeatureResult Property   Microsoft.Windows.ServerManager.Commands.FeatureResult[] FeatureResult {get;}
RestartNeeded Property   Microsoft.Windows.ServerManager.Commands.RestartState RestartNeeded {get;}
Success       Property   System.Boolean Success {get;}

现在我想在C#中使用这种类型,但为此我需要拥有具有此命名空间的库。我只能找到

C:\Windows\winsxs\amd64_microsoft.windows.servermanager_31bf3856ad364e35_6.1.7601.17514_none_c70b231167ed6fc3

Microsoft.Windows.ServerManager.dll所在的目录。这个库可以在visual studio中引用,但它的命名空间不包含.Commands命名空间(?)类(?)

  1. 我知道哪里可以找到合适的图书馆?
  2. 也许有办法检索Success(boolean)属性而不添加这个库作为参考?
  3. C#$RES中的

    会有PSObject类型,因为它是Invoke()命令的结果

2 个答案:

答案 0 :(得分:0)

我发现了。为了能够使用Add-WindowsFeature,您必须首先导入名为ServerManager的服务器模块。此服务器模块位于

C:\Windows\System32\WindowsPowerShell\v1.0\Modules\ServerManager

目录。在同一目录中,ServerManager.psd1文件包含行

NestedModules = 'Microsoft.Windows.ServerManager.PowerShell'

如果您搜索Microsoft.Windows.ServerManager.PowerShell.dll库。你应该找到它的一个实例,这个实例包含我在问题中提到的.Commands命名空间。

答案 1 :(得分:0)

相关DLL的名称和位置是实现细节,可能会在发行版之间发生变化。我发现在PowerShell结果中处理结构化对象的最简单方法是使用C#“动态”功能。例如:

public bool FeatureIsInstalled(string name)
{
    bool result = false;

    using (Pipeline pipeline = runspace.CreatePipeline(
        string.Format("Get-WindowsFeature '{0}'", name)))
    {
        Collection<PSObject> output = pipeline.Invoke();
        if (output.Count > 0)
        {
            dynamic o1 = output[0];
            result = (bool)o1.Installed;
        }
    }

    return result;
}