Получение информации о сервере обмена?

1

В моем офисе у меня есть сервер Exchange 2013. Я хочу найти всю информацию об обменном сервере, которую я нашел, используя команды оболочки управления обменом. Я хочу найти данные, как показано ниже.

Имя сервера, количество почтовых ящиков, количество почтовых контактов, хранилище данных, группа хранения, недавно созданные и удаленные почтовые ящики, информация обо всех процессах электронной почты через сервер обмена, информация о отправителях, получателях и многое другое, которые я нахожу на сервере обмена.

программно. Я хочу найти эту информацию программно с географической дистанции с помощью С#. У меня есть окно 7 на моей машине, через которое я хочу это сделать. Я пытаюсь использовать удаленную силовую оболочку с С#. Например, у меня есть команды оболочки управления обменом, т.е.

Get-mailbox -resultsize unlimited -filter {$_.forwardingaddress -ne $null} | select name, userprincipalname

после выполнения вышеуказанных командлетов с использованием оболочки управления обменом, у меня есть некоторые данные, я хочу получить аналогичную информацию программно с помощью С#.

Мой фрагмент кода

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections.ObjectModel;
using System.Management.Automation; 
using System.Management.Automation.Runspaces;
namespace WindowsFormsApplication1
{
 public partial class Form1 : Form
 {
   public Form1()
   {
        InitializeComponent();
   }
   private void button1_Click(object sender, EventArgs e)
   {
     string schemaURI = "http://schemas.microsoft.com/powershell/Microsoft.Exchange";
     Uri connectTo = new Uri("https://<serverIP>/powershell/");
     string strpassword = "password";   
     System.Security.SecureString securePassword = new System.Security.SecureString();
     foreach (char c in strpassword)
     {
         securePassword.AppendChar(c);
     }
     PSCredential credential = new PSCredential("Administrator", securePassword);
     WSManConnectionInfo connectionInfo = new WSManConnectionInfo(connectTo,schemaURI, credential);
     connectionInfo.MaximumConnectionRedirectionCount = 5;
     connectionInfo.SkipCACheck = true;
     connectionInfo.SkipCNCheck = true;
     try
     {
        Runspace remoteRunspace = RunspaceFactory.CreateRunspace(connectionInfo);
        remoteRunspace.Open();
        var command = new Command("Get-mailbox");
        command.Parameters.Add("resultsize", "unlimited");
        command.Parameters.Add("Filter", "{forwardingaddress -ne $null}");
        var pipeline = remoteRunspace.CreatePipeline();
        pipeline.Commands.Add(command);
        var results = pipeline.Invoke();    
        foreach (PSObject item in results)
        {                                                                                          
            PSPropertyInfo pinfo = (PSPropertyInfo)item.Properties["Name"];
            PSPropertyInfo prop = (PSPropertyInfo)item.Properties["userprincipalname"];
            //prop = item.Properties["Name"];
            if (pinfo != null)
            {
                  MessageBox.Show(pinfo.Value.ToString());
            }
            if (prop != null)
            {
                  MessageBox.Show(prop.Value.ToString());
            }
         }
         remoteRunspace.Dispose();
        }
      catch (Exception ex)
      {
          MessageBox.Show(ex.Message); 
      }            
    }
  }
}

Линия:

   remoteRunspace.Open();

Выведите приведенное ниже исключение:

Ошибка подключения к удаленному серверу со следующим сообщением об ошибке: клиент WinRM не может обработать запрос. Клиент WinRM попытался использовать механизм проверки подлинности Negotiate, но конечный компьютер (IP: 443) вернул ошибку "access denied". Измените конфигурацию, чтобы можно было использовать механизм проверки подлинности Negotiate или указать один из механизмов аутентификации, поддерживаемых сервером. Чтобы использовать Kerberos, укажите имя локального компьютера в качестве удаленного адресата. Также убедитесь, что клиентский компьютер и конечный компьютер соединены с доменом. Чтобы использовать Basic, укажите имя локального компьютера в качестве удаленного адресата, укажите Обычную проверку подлинности и укажите имя пользователя и пароль. Возможные механизмы аутентификации, сообщаемые сервером: Дополнительные сведения см. В разделе справки about_Remote_Troubleshooting

Как я могу исправить этот тип исключения?

Теги:
powershell
exchange-server

2 ответа

1
Лучший ответ

Перейдите к приведенному ниже пути на своем сервере, о котором вы хотите получить вышеуказанную информацию.

Start Menu -> Administrative tools -> iis manager -> Sites -> default web site -> powershell 

Затем выберите "Аутентификация IIS" в /powershell home и после открытия проверки подлинности существует шесть аутентификаций, перечисленных ниже.

Anonymous authentication "disabled"
Asp.net impersonation    "disabled"
Basic authentication     "disabled"
Digest authentication    "disabled"
Forms authentication     "disabled"
Windows authentication   "disabled"

Теперь включена последняя аутентификация, то есть аутентификация Windows. После включения проверки подлинности Windows они выглядят ниже

Anonymous authentication "disabled"
Asp.net impersonation    "disabled"
Basic authentication     "disabled"
Digest authentication    "disabled"
Forms authentication     "disabled"
Windows authentication   "enabled"

После этого запустите свой код и получите желаемый результат.

0

Вам нужно установить для AuthenticationMechanism объект WSManConnectionInfo, который вы используете, чтобы соответствовать тому, как вы настроили Exchange Server. Если вы используете https, тогда вы должны установить его на Basic, например

connectionInfo.AuthenticationMechanism = AuthenticationMechanism.Basic;

В противном случае, если у вас все еще есть конфигурация по умолчанию на вашем сервере Exchange, вы можете использовать Kerberos и http, поэтому измените то, что используется в образцах MSDN. Http://technet.microsoft.com/en-us/library/dd335083(v=exchg. 150).aspx (убедитесь, что вы используете полное доменное имя, а не IP-адрес)

Uri connectTo = new Uri("http://<FQDN>/powershell/");

а затем использовать

connectionInfo.AuthenticationMechanism = AuthenticationMechanism.Kerberos;

Cheers Glen

  • 0
    Я установил AuthenticationMechanism на объект WSManConnectionInfo, и я также заменяю IP-адрес сервера на полное доменное имя, но все же получаю исключение, т.е. не удалось подключиться к удаленному серверу со следующим сообщением об ошибке: Клиент WinRM не может обработать запрос, поскольку имя сервера не может быть решен. Для получения дополнительной информации см. Раздел справки about_Remote_Trou Troubleshooting.
  • 0
    Эта ошибка указывает на то, что вы не можете определить полное доменное имя, которое вы пытаетесь использовать. Вы должны иметь возможность пинговать любое имя сервера, если вы не можете, это никогда не сработает. Вы пробовали просто использовать Powershell для подключения с консоли? если вы решите, какие настройки auth / server работают в консоли, вы сможете легко перенести их в свой код.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню