سؤال

أرغب في إنشاء تطبيق صغير يمكنه جمع معلومات النظام (win32_blablablabla) باستخدام WinRM بدلاً من WMI. كيف يمكنني فعل ذلك من C#؟

الهدف الرئيسي هو استخدام WS-Man (WinRM) بدلاً من DCOM (WMI).

هل كانت مفيدة؟

المحلول

أعتقد أن أسهل طريقة هي استخدام أتمتة Wsman. المرجع wsmauto.dll من Windwos System32 في مشروعك:

alt text

ثم ، يجب أن يعمل الرمز أدناه من أجلك. وصف 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://getthinktank.com/2015/06/22/naos-winrm-windows-remote-management-through-net/.

الكود في ملف واحد إذا كنت تريد فقط نسخه ، كما أنه حزمة nuget تتضمن الإشارة إلى System.Management.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);

آمل أن يساعد هذا ، لقد كنت أستخدم هذا لفترة من الوقت مع عمليات النشر الآلية. يرجى ترك التعليقات إذا وجدت مشكلات.

أود أن ألاحظ أن هذا يوضح خطأ interop افتراضيًا في Visual Studio 2010.
راجع http://blogs.msdn.com/b/mshneer/archive/2009/12/07/interop-type-xxx-cannot-ebe-embedded-use-the-edlabledice-instead.aspx

يبدو أن هناك طريقتان لحل هذا. تم توثيق هذا أولاً في المقالة المذكورة أعلاه ويبدو أنها الطريقة الصحيحة للتعامل مع المشكلة. التغييرات ذات الصلة لهذا المثال هي:

wsman wsmanobject = new wsman () ؛ هذا بدلاً من iwsman wsman = جديد wsmanclass () ؛ والتي سوف ترمي الخطأ.

الدقة الثانية هي الانتقال إلى VS2010—> Solution Explorer—> Solution—> Project—> المراجع وتحديد wsmanautomation. انقر بزر الماوس الأيمن أو اضغط على alt-enter للوصول إلى الخصائص. قم بتغيير قيمة خاصية "التضمين بين أنواع الأنواع" من مرجع WSMAUTO.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top