Использование PowerShell для чтения членов группы Office 365 на C#

Я пытаюсь подключиться к группе Office 365 и перечислить членство в группе с помощью Powershell через проект С#.

Из этой статьи я определил, что мне нужно использовать команду

Get-UnifiedGroupLinks –Identity groupalias –LinkType Members

Вот мой текущий код:

string connectionUri = "https://outlook.office365.com/powershell-liveid/";
SecureString secpassword = new SecureString();
foreach (char c in Password)
{
    secpassword.AppendChar(c);
}
PSCredential credential = new PSCredential(UserName, secpassword);

Runspace runspace = RunspaceFactory.CreateRunspace();
PSObject SessionHolder = null;
using (PowerShell powershell = PowerShell.Create())
{
    PSCommand command = new PSCommand();
    command.AddCommand("New-PSSession");
    command.AddParameter("ConfigurationName", "Microsoft.Exchange");
    command.AddParameter("ConnectionUri", new Uri(connectionUri));
    command.AddParameter("Credential", credential);
    command.AddParameter("Authentication", "Basic");
    powershell.Commands = command;

    runspace.Open();
    powershell.Runspace = runspace;
    Collection<System.Management.Automation.PSObject> result = powershell.Invoke();
    if (powershell.Streams.Error.Count > 0 || result.Count != 1)
    {
        throw new Exception("Fail to establish the connection");
    }
    else
        SessionHolder = result[0];
}
using (PowerShell powershell = PowerShell.Create())
{
    PSCommand command = new PSCommand();
    // –Identity groupalias –LinkType Members
    command = new PSCommand();
    command.AddCommand("Invoke-Command");
    command.AddParameter("ScriptBlock", System.Management.Automation.ScriptBlock.Create("Get-UnifiedGroupLinks"));
    command.AddParameter("Session", SessionHolder);
    command.AddParameter("Identity", groupAddress);
    command.AddParameter("LinkType", "Members");
    powershell.Commands = command;
    powershell.Runspace = runspace;

    Collection<PSObject> PSOutput = powershell.Invoke();
    // loop through each output object item
    foreach (PSObject outputItem in PSOutput)
    {

    }
}

Переменные, использованные выше, объявление не показано: "UserName", "Password", "groupAddress"

Я могу установить соединение со службой, но когда я пытаюсь получить членов группы, я получаю сообщение об ошибке «Не удается найти параметр, который соответствует имени параметра «Идентификация»».

Я не уверен, как действовать при устранении неполадок в моем коде. Я пробовал групповую электронную почту, псевдоним группы и отображаемое имя группы в параметре Identity. Может у меня что-то другое не так?

Я использую следующие библиотеки в Visual Studio 2017 на компьютере с Windows 10:

using System.Management.Automation;
using System.Management.Automation.Runspaces;

person MrMatt    schedule 20.04.2017    source источник


Ответы (2)


Обычно я получаю эту ошибку, когда передаю переменную с некоторыми дополнительными символами. Проверьте, как передается переменная, если это просто "электронная почта" или содержит другую информацию, например @{"email"}. Очень часто встречается в Powershell.

Надеюсь, это прольет свет. Потому что команда очень проста:

Get-UnifiedGroupLinks -Identity [name] -LinkType members
person Alex    schedule 20.04.2017
comment
Я дважды проверил, что в переменной нет ничего особенного. Я даже пытался указать адрес электронной почты непосредственно в команде. К сожалению, возникает та же ошибка. - person MrMatt; 21.04.2017
comment
О, извините, он говорит, что он не распознает идентичность этого флага, что, если вы добавите -Identity вместо просто идентичности? - person Alex; 21.04.2017
comment
Привет, Алекс, я пробовал с «-Identity», похоже, это не имело значения, но я нашел возможное решение. Я добавил следующий код перед просмотром членов группы, и он начал работать. ‹code› PSCommand ImportSession = new PSCommand(); ImportSession.AddCommand(Import-PSSession); ImportSession.AddParameter(Session, SessionHolder); powershell.Commands = ImportSession; powershell.Invoke();‹/code› - person MrMatt; 21.04.2017
comment
О, это имеет смысл. Когда вы подключились, он не запустил новый PSsession, который он загрузил. Рад, что исправили! - person Alex; 26.04.2017

Я нашел немного кода, который заставляет все работать... Это замедляет работу, поэтому я не уверен, что есть лучший способ, но вот мой обновленный код:

string connectionUri = "https://outlook.office365.com/powershell-liveid/";
SecureString secpassword = new SecureString();
foreach (char c in Password)
{
    secpassword.AppendChar(c);
}
PSCredential credential = new PSCredential(UserName, secpassword);

Runspace runspace = RunspaceFactory.CreateRunspace();
PSObject SessionHolder = null;
using (PowerShell powershell = PowerShell.Create())
{
    string connectionUri = "https://outlook.office365.com/powershell-liveid/";
    SecureString secpassword = new SecureString();
    foreach (char c in Password)
    {
        secpassword.AppendChar(c);
    }
    PSCredential credential = new PSCredential(UserName, secpassword);
    PSCommand command = new PSCommand();
    command.AddCommand("New-PSSession");
    command.AddParameter("ConfigurationName", "Microsoft.Exchange");
    command.AddParameter("ConnectionUri", new Uri(connectionUri));
    command.AddParameter("Credential", credential);
    command.AddParameter("Authentication", "Basic");
    powershell.Commands = command;

    runspace.Open();
    powershell.Runspace = runspace;
    Collection<System.Management.Automation.PSObject> result = powershell.Invoke();
    if (powershell.Streams.Error.Count > 0 || result.Count != 1)
        throw new Exception("Fail to establish the connection");
    else
        SessionHolder = result[0];

    PSCommand ImportSession = new PSCommand();
    ImportSession.AddCommand("Import-PSSession");
    ImportSession.AddParameter("Session", SessionHolder);
    powershell.Commands = ImportSession;
    powershell.Invoke();

    PSCommand GrabGroup = new PSCommand();
    GrabGroup.AddCommand("Get-UnifiedGroupLinks");
    GrabGroup.AddParameter("Identity", GroupAddress);
    GrabGroup.AddParameter("LinkType", "Members");
    powershell.Commands = GrabGroup;
    Collection<PSObject> PSOutput_GroupMembers = powershell.Invoke();
    foreach (PSObject outputItem in PSOutput_GroupMembers)
    {
        //Process Members
    }
}

Кажется, ключ в том, что мне нужно импортировать сеанс, прежде чем я смогу начать его использовать.

person MrMatt    schedule 21.04.2017