Как войти в сеанс XEN из программы на C #, используя пароль защищенной строки? - PullRequest
0 голосов
/ 28 ноября 2018

Я использую PowerShell 5.1, Visual Studio 2017, C # и XenServer SDK 7.1.1.

Используя Get-Credentials и Export-CliXml в программе PowerShell, я сохранил свой главный сервер пулавведите учетные данные для пользователя root в файл учетных данных XML (xml_creds.xml)

Теперь я хочу создать сеанс и войти в него с помощью C # (см. код ниже).Как вы можете видеть, я вынужден преобразовать мою защищенную строку в текстовую строку, чтобы удовлетворить сигнатуру метода login_with_password API Xen .NET.

Используя API, как мне войти всеанс с использованием защищенной строки?

Код

try
{

    securedPassword = new SecureString();
    string unsecuredPassword = "";

    Runspace rs = RunspaceFactory.CreateRunspace();
    rs.Open();

    Pipeline pipeline = rs.CreatePipeline(@"Import-CliXml 'C:\foo\xml_creds.xml';");

    Collection<PSObject> results = pipeline.Invoke();

    if (results.Count == 1)
    {
        PSObject psOutput = results[0];

        securedPassword = ((PSCredential)psOutput.BaseObject).Password;
        unsecuredPassword = new System.Net.NetworkCredential(string.Empty, securedPassword).Password;
        username = ((PSCredential)psOutput.BaseObject).UserName;

        rs.Close();

        session = new Session(hostname, port);

        session.login_with_password(username, unsecuredPassword, API_Version.API_1_3);
    }
    else
    {
        throw new System.Exception("Could not obtain pool master server credentials");
    }
}
catch (Exception e1)
{
    System.Console.WriteLine(e1.Message);
}
finally
{
    if (securedPassword != null)
    {
        securedPassword.Dispose();
    }

    if (session != null)
    {
        session.logout(session);
    }
}

1 Ответ

0 голосов
/ 28 ноября 2018

Я связался с Citrix.

API-интерфейс Xen не предоставляет механизм для входа в сеанс с использованием пароля безопасной строки .

Итак, я закончил с использованиемC # программа, которая выполняет два PowerShell сценария, которые поддерживают пароль защищенной строки.

См. код ниже.

Примечания:

У меня установлен модуль XenServerPS 7.1.1 в папке% USERPROFILE% \ Documents \ WindowsPowerShell \ Modules \ XenServerPSModule.Этот модуль содержит командлет Connect-XenServer

. Я создал файл учетных данных xml, используя get-учетные данные PowerShell, а затем экспорт-clixml

form1.cs (форма имеет толькокнопка)

using System;
using System.Windows.Forms;
using XenSnapshotsXenAccess;

namespace Create_XenSnapshotsUi
{
    public partial class Form1 : Form
    {
        XenSessionAccess xenSession = null;

        public Form1()
        {
            InitializeComponent();
        }

        private void Button1_Click(object sender, EventArgs e)
        {

            xenSession = new XenSessionAccess("https://xxx.xx.x.x", @"C:\foo\xml_credentials.xml");

            xenSession.Logout();

        }
    }
}

XenSessionAccess класс

using System;
using System.Collections.ObjectModel;
using System.Management.Automation;
using System.Management.Automation.Runspaces;
using XenAPI;

namespace XenSnapshotsXenAccess
{
    public class XenSessionAccess
    {
        private Session xenSession = null;

        public Session XenSession { get => xenSession; set => xenSession = value; }

        public void Logout()
        {
            if (XenSession != null)
            {
                XenSession.logout(XenSession);
            }
        }

        public XenSessionAccess(string poolMasterServerUrl, string xml_creds_path)
        {
            Collection<PSObject> results = null;
            PSCredential psCredential = null;

            //https://docs.microsoft.com/en-us/powershell/developer/hosting/creating-an-initialsessionstate

            //Createdefault2* loads only the commands required to host Windows PowerShell (the commands from the Microsoft.PowerShell.Core module.
            InitialSessionState initialSessionState = InitialSessionState.CreateDefault2();

            using (Runspace runSpace = RunspaceFactory.CreateRunspace(initialSessionState))
            {
                runSpace.Open();

                using (PowerShell powerShell = PowerShell.Create())
                {
                    powerShell.Runspace = runSpace;
                    powerShell.AddCommand("Import-CliXml");

                    powerShell.AddArgument(xml_creds_path);
                    results = powerShell.Invoke();

                    if (results.Count == 1)
                    {
                        PSObject psOutput = results[0];
                        //cast the result to a PSCredential object
                        psCredential = (PSCredential)psOutput.BaseObject;
                    }
                    else
                    {
                        throw new System.Exception("Could not obtain pool master server credentials");
                    }
                }

                runSpace.Close();
            }

            initialSessionState = InitialSessionState.CreateDefault2();
            initialSessionState.ImportPSModule(new string[] { "XenServerPSModule" });
            initialSessionState.ExecutionPolicy = Microsoft.PowerShell.ExecutionPolicy.Unrestricted;

            SessionStateVariableEntry psCredential_var = new SessionStateVariableEntry("psCredential", psCredential, "Credentials to log into pool master server");
            initialSessionState.Variables.Add(psCredential_var);

            SessionStateVariableEntry poolUrl_var = new SessionStateVariableEntry("poolUrl", poolMasterServerUrl, "Url of pool master server");
            initialSessionState.Variables.Add(poolUrl_var);

            using (Runspace runSpace = RunspaceFactory.CreateRunspace(initialSessionState))
            {
                runSpace.Open();

                using (PowerShell powerShell = PowerShell.Create())
                {
                    powerShell.Runspace = runSpace;
                    powerShell.AddScript(@"$psCredential | Connect-XenServer -url $poolUrl -SetDefaultSession -PassThru");
                    results = powerShell.Invoke();
                }

                if (results.Count == 1)
                {
                    PSObject psOutput = results[0];
                    //cast the result to a XenAPI.Session object
                    XenSession = (Session)psOutput.BaseObject;
                }
                else
                {
                    throw new System.Exception(String.Format("Could not create session for {0}", poolMasterServerUrl));
                }

                runSpace.Close();
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...