Пользовательская лицензия набора веб-служб Office 365

#c# #web-services #powershell #sharepoint #office365

#c# #веб-службы #powershell #sharepoint #office365

Вопрос:

Итак, в принципе, я хочу установить пользовательскую лицензию AD (сценарий Powershell) из кода C #. Вот код:

 //adminUser amp; adminPassword from app.config

    public static string SetUserLicense(string userPrincipalName, string adminUser, SecureString adminPassword, string licenses)
            {
                string strReturn = "";
                try
                {
                    // Create Initial Session State for runspace.
                    InitialSessionState initialSession = InitialSessionState.CreateDefault();
                    initialSession.ImportPSModule(new[] { "MSOnline" });
                    // Create credential object.
                    PSCredential credential = new PSCredential(adminUser, adminPassword);
                    // Create command to connect office 365.
                    Command connectCommand = new Command("Connect-MsolService");
                    connectCommand.Parameters.Add((new CommandParameter("Credential", credential)));

                    Command userCommand = new Command("Set-MsolUser");
                    userCommand.Parameters.Add((new CommandParameter("UserPrincipalName", userPrincipalName)));
                    userCommand.Parameters.Add((new CommandParameter("UsageLocation", "ID")));

                    Command licCommand = new Command("Set-MsolUserLicense");
                    licCommand.Parameters.Add((new CommandParameter("UserPrincipalName", userPrincipalName)));
                    licCommand.Parameters.Add((new CommandParameter("AddLicenses", licenses)));

                    using (Runspace psRunSpace = RunspaceFactory.CreateRunspace(initialSession))
                    {
                        // Open runspace.
                        psRunSpace.Open();

                        //Iterate through each command and executes it.
                        foreach (var com in new Command[] { connectCommand, userCommand, licCommand })
                        {
                            if (com != null)
                            {
                                var pipe = psRunSpace.CreatePipeline();
                                pipe.Commands.Add(com);
                                // Execute command and generate results and errors (if any).
                                Collection<PSObject> results = pipe.Invoke();
                                var error = pipe.Error.ReadToEnd();
                                if (error.Count > 0 amp;amp; com == licCommand)
                                {
                                    strReturn = error[0].ToString();
                                }
                                else if (results.Count >= 0 amp;amp; com == licCommand)
                                {
                                    strReturn = "User License update successfully.";
                                }
                            }
                        }
                        // Close the runspace.
                        psRunSpace.Close();
                    }
                }
                catch (Exception ex)
                {

                    strReturn = ex.Message;
                }
                return strReturn;
            }
 

Однако, когда я запускаю ее, все работает хорошо (нелицензионные теперь становятся лицензированными). Затем я опубликовал код, чтобы получить DLL amp; Services.asmx, которые запускаются на сервере. После этого я создаю агент службы и добавляю ссылку на службу (URL веб-службы), поэтому периодически агент может вызывать функцию SetUserLicense.

Вот код из service agent, который вызывает веб-службу:

 NewWSOffice365.ServicesSoapClient Service = new NewWSOffice365.ServicesSoapClient();
string Result = Service.SetUserLicense("blabla@bns.org");
 

Проблема в том, что при запуске агента службы я получаю сообщение об ошибке:

Перед вызовом любых других командлетов необходимо вызвать командлет Connect-MsolService.

Странная вещь, я вставил Connect-MsolService в свой код на C # (см. Выше). Здесь все соответствует его требованиям: http://code.msdn.microsoft.com/office/Office-365-Manage-licenses-fb2c6413 и установите для пользовательского профиля IIS AppPool значение true (по умолчанию: false).

Комментарии:

1. Вы запускали сценарий PowerShell на сервере?

2. @Matt скрипт PowerShell запускается на сервере, который вызывается из веб-службы (допустим, 10.21.50.43: 81 ). Проблема в том, что когда я вызываю веб-службу, она возвращает ошибку (написано выше), тогда как при отладке проекта веб-службы сценарий PowerShell выполняется отлично.

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

4. Я хотел бы знать, есть ли в наличии эквивалент MS.Graph API C #.

Ответ №1:

Вам необходимо добавить сеанс Powershell перед использованием учетных данных «Connect-MsolService» — это ваши вышеуказанные учетные данные.

 PSCommand psSession = new PSCommand();
psSession.AddCommand("New-PSSession");
psSession.AddParameter("ConfigurationName", "Microsoft.Exchange");
psSession.AddParameter("ConnectionUri", new Uri("https://outlook.office365.com/powershell-liveid/"));
psSession.AddParameter("Credential", credential);
psSession.AddParameter("Authentication", "Basic");
psSession.AddParameter("AllowRedirection");

powershell.Commands = psSession;
powershell.Invoke();

PSCommand connect = new PSCommand();
connect.AddCommand("Connect-MsolService");
connect.AddParameter("Credential", credential);

powershell.Commands = connect;
powershell.Invoke();