Подтвердить что ты не робот

Как получить доступ к WinRM в С#

Я хотел бы создать небольшое приложение, которое может собирать системную информацию (Win32_blablabla) с помощью WinRM, в отличие от WMI. Как я могу сделать это с С#?

Основная цель - использовать WS-Man (WinRm), а не DCOM (WMI).

4b9b3361

Ответ 1

Я думаю, самый простой способ - использовать автоматизацию WSMAN. Ссылка wsmauto.dll от windwos\system32 в вашем проекте:

alt text

тогда приведенный ниже код должен работать на вас. Описание API находится здесь: msdn: API WinRM С++

IWSMan wsman = new WSManClass();
IWSManConnectionOptions options = (IWSManConnectionOptions)wsman.CreateConnectionOptions();                
if (options != null)
{
    try
    {
        // options.UserName = ???;  
        // options.Password = ???;  
        IWSManSession session = (IWSManSession)wsman.CreateSession("http://<your_server_name>/wsman", 0, options);
        if (session != null)
        {
            try
            {
                // retrieve the Win32_Service xml representation
                var reply = session.Get("http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/Win32_Service?Name=winmgmt", 0);
                // parse xml and dump service name and description
                var doc = new XmlDocument();
                doc.LoadXml(reply);
                foreach (var elementName in new string[] { "p:Caption", "p:Description" })
                {
                    var node = doc.GetElementsByTagName(elementName)[0];
                    if (node != null) Console.WriteLine(node.InnerText);
                }
            }
            finally
            {
                Marshal.ReleaseComObject(session);
            }
        }
    }
    finally
    {
        Marshal.ReleaseComObject(options);
    }
}

надеюсь, что это поможет, считает

Ответ 2

У меня есть статья, в которой описывается простой способ запуска Powershell через WinRM из .NET в http://getthinktank.com/2015/06/22/naos-winrm-windows-remote-management-through-net/.

Код находится в одном файле, если вы хотите просто скопировать его, а также пакет NuGet, который включает ссылку на System.Management.Automation.

Он автоматически управляет доверенными хостами, может запускать блоки script, а также отправлять файлы (которые на самом деле не поддерживаются, но я создал работу). Возвращения всегда являются исходными объектами Powershell.

// this is the entrypoint to interact with the system (interfaced for testing).
var machineManager = new MachineManager(
    "10.0.0.1",
    "Administrator",
    MachineManager.ConvertStringToSecureString("xxx"),
    true);

// will perform a user initiated reboot.
machineManager.Reboot();

// can run random script blocks WITH parameters.
var fileObjects = machineManager.RunScript(
    "{ param($path) ls $path }",
    new[] { @"C:\PathToList" });

// can transfer files to the remote server (over WinRM protocol!).
var localFilePath = @"D:\Temp\BigFileLocal.nupkg";
var fileBytes = File.ReadAllBytes(localFilePath);
var remoteFilePath = @"D:\Temp\BigFileRemote.nupkg";
machineManager.SendFile(remoteFilePath, fileBytes);

Надеюсь, что это поможет, я использовал это некоторое время с помощью моих автоматизированных развертываний. Если вы найдете проблемы, оставьте комментарии.

Ответ 3

Я хотел бы отметить, что это показывает ошибку interop по умолчанию в Visual Studio 2010.
c.f. http://blogs.msdn.com/b/mshneer/archive/2009/12/07/interop-type-xxx-cannot-be-embedded-use-the-applicable-interface-instead.aspx

Кажется, есть два способа решить эту проблему. Это первое описано в статье, указанной выше, и, по-видимому, является правильным способом решения этой проблемы. Соответствующие изменения для этого примера:

WSMan wsManObject = новый WSMan(); Это вместо IWSMan wsman = new WSManClass(); который выдает ошибку.

Вторая резолюция - перейти к разделу VS2010- > Solution Explorer- > Solution- > Project- > References и выбрать WSManAutomation. Щелкните правой кнопкой мыши или нажмите Alt-Enter для доступа к свойствам. Измените значение свойства "Вставить типы вторжений" в ссылку wsmauto.