Как получить доступ к WinRM в C #
-
04-10-2019 - |
Вопрос
Я хотел бы создать небольшое приложение, которое может собирать системную информацию (Win32_Blablabla), используя WinRM в отличие от WMI. Как я могу сделать это от C #?
Основная цель - использовать WS-Man (WinRM) в отличие от DCOM (WMI).
Решение
Я думаю, что самый простой способ использовать автоматизацию WSMAN. Ссылка wsmauto.dll из Windwos System32 в вашем проекте:
Затем код ниже должен работать для вас. Описание API здесь: MSDN: WinRM C ++ API
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);
}
}
Надеюсь, это поможет, по отношению
Другие советы
У меня есть статья, которая описывает простой способ запуска PowerShell через WinRM из .NET в http://getthithinktank.com/2015/06/22/naos-winrm-window-remote-management-through-net/.
Код находится в одном файле, если вы хотите просто скопировать его, и это также пакет Nuget, который включает в себя ссылку на систему. Anmagement.automation.
Он автоматически управляет надежными хозяевами, может запускать блоки сценариев, а также отправлять файлы (которые на самом деле не поддерживаются, но я создал работу вокруг). Возвращение всегда являются сырыми объектами от 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's protocol!).
var localFilePath = @"D:\Temp\BigFileLocal.nupkg";
var fileBytes = File.ReadAllBytes(localFilePath);
var remoteFilePath = @"D:\Temp\BigFileRemote.nupkg";
machineManager.SendFile(remoteFilePath, fileBytes);
Надеюсь, это поможет, я использовал это некоторое время с моим автоматическим развертыванием. Пожалуйста, оставьте комментарии, если вы обнаружите проблемы.
Я хотел бы отметить, что это показывает ошибку взаимодействия по умолчанию в Visual Studio 2010.
ср http://blogs.msdn.com/b/mshneer/Archive/2009/12/07/interop-type-xxx-cannot-be-meddedded-use-te-appladable-interface-instead.aspx.
Там, кажется, два способа решения этого. Это сначала задокументировано в статье, перечисленной выше, и, по-видимому, является правильным способом решения проблемы. Соответствующие изменения в этом примере:
WSMAN WSMANOBJECT = новый WSMAN (); Это вместо IWSMAN WSMAN = NEW WSMANCLASS (); который бросит ошибку.
Второе разрешение - перейти к VS2010-> Проводнику по решению -> Проекта-> Ссылки и выберите WSManautomation. Щелкните правой кнопкой мыши или нажмите Alt-Enter, чтобы получить доступ к свойствам. Измените значение «встроенных типов Interops» Справочника WSMAUTO.