WMI ではなく WinRM を使用して、システム情報 (Win32_blablabla) を収集できる小さなアプリケーションを作成したいと考えています。どうすればC#からそれを行うことができますか?
主な目標は、DCOM (WMI) ではなく WS-Man (WinRm) を使用することです。
WMI ではなく WinRM を使用して、システム情報 (Win32_blablabla) を収集できる小さなアプリケーションを作成したいと考えています。どうすればC#からそれを行うことができますか?
主な目標は、DCOM (WMI) ではなく WS-Man (WinRm) を使用することです。
最も簡単な方法は、WSMAN 自動化を使用することだと思います。プロジェクトで、windwos\system32 から wsmauto.dll を参照します。
次に、以下のコードが機能するはずです。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);
}
}
これが役に立てば幸いです、よろしく
http://getthinktank.com/2015/06/22/naos-winrm-windows-remote-management-through-net/で、.NET から WinRM を介して Powershell を実行する簡単な方法を説明する記事を入手しました。
コードをコピーするだけの場合、コードは単一のファイルにあり、System.Management.Automation への参照を含む NuGet パッケージでもあります。
信頼できるホストを自動管理し、スクリプト ブロックを実行し、ファイルを送信することもできます (これは実際にはサポートされていませんが、回避策を作成しました)。戻り値は常に 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 ではデフォルトで相互運用エラーが表示されることに注意してください。-embedded-use-the-applicable-interface-instead.aspx
これを解決するには2つの方法があるようです。これは最初に上記の記事に記載されており、問題を処理する正しい方法のようです。この例に関連する変更は次のとおりです。
WSMan wsManObject = new WSMan(); これは、IWSMan wsman = new WSManClass(); の代わりです。エラーがスローされます。
2 つ目の解決策は、VS2010—>Solution Explorer—>Solution—>Project—>References に移動し、WSManAutomation を選択することです。プロパティにアクセスするには、右クリックするか Alt-Enter を押します。wsmauto リファレンスの「Embed Interop Types」プロパティの値を変更します。