Как передать объект json экземпляру PowerShell в качестве параметра скрипту в C #? - PullRequest
0 голосов
/ 02 июля 2019

Я создаю приложение, которое взаимодействует с Active Directory с помощью System.Management.Automation (не использует службы каталогов, поскольку в настоящее время изучает эту библиотеку и изучает ее).Чтобы обновить членство в группе для группы в активном каталоге, я создаю объект JSON в своем представлении и вызываю функцию для передачи объекта и URI от внешнего интерфейса к внутреннему через функцию в моем контроллере.

Основная идея заключается в том, чтобы разрешить массовое удаление членов группы AD, передав объект JSON в качестве параметра сценарию оболочки, который будет выполнен в экземпляре PowerShell, созданном в функции.Я использую вызов .ajax для вызова функции контроллера и передачи объекта JSON, который я сгенерировал в качестве аргумента, вместе с текущим URI.Функция shell.commands.AddParameter () принимает аргумент только в строковом формате.Итак, я напечатал его с помощью ToString () и преобразовал его в JSON в сценарии PowerShell.Я передаю URL из кода, так как URL может быть изменен.Я не получаю никаких ошибок Однако, я также не могу видеть какие-либо обновления в членстве в AD.Объект Json генерируется из таблицы HTML.

Мой сценарий оболочки

param($objMemberUpdate, $uri)
$body = $objMemberUpdate | ConvertTo-JSON
Invoke-WebRequest -Uri $uri -Method Post -Body $objMemberUpdate

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

private string UpdateMemberList(JsonResult objMemberUpdate)
    {
        var uri = HttpContext.Request.Url.AbsoluteUri;
        var shell = PowerShell.Create();
        shell.Commands.AddCommand(AppDomain.CurrentDomain.BaseDirectory + "Shell\\Set-ADGroupMembership.ps1").AddParameter(objMemberUpdate.ToString(), uri);
        var results = shell.Invoke();
        shell.Dispose();
        return results.ToString();
    }

Вызов Ajax, который я вызываю нажатием кнопки на моей HTML-странице.

//Make Array Object to pass in the API For Membership Update
    $("#btnUpdate").click(function () {
        var RemoveMembers = [];
        var RemoveAfter = [];
        var MemberUpdate = {};
        var GroupGUID = "";
        $("table [id*=ddlReqdAdjustment]").each(function () {
            if ($(this).val() != "Keep") {
                GroupGUID = $(this).parent().parent().children().eq(4)[0].innerText;
                var date = $(this).parent().parent().children().eq(8)[0].firstElementChild.value;
                var ObjectGUID = $(this).parent().parent().children().eq(3)[0].innerText + "@@" + $('#ddlDirectory').val();

                if ($(this).val() == "Remove") {
                    var format = ObjectGUID;
                    RemoveMembers.push(format);
                } else {
                    var format = date + "|" + ObjectGUID;
                    RemoveAfter.push(format);
                }
            }
        });
        MemberUpdate = {
            "Directory": $('#ddlDirectory').val(),
            "Group": GroupGUID,
            "Remove": RemoveMembers,
            "RemoveAfter": RemoveAfter,
            "ResultFormat": "json",
            "OnBehalfOf": "11112201"            
        };
        console.log(MemberUpdate);
        $.ajax({
            type: "POST",
            url: "/Group/UpdateMemberList",
            data: { objMemberUpdate: MemberUpdate },
            success: function (response) {
                alert(response.message);
            }
        });

Предполагается, что выбранный элемент в таблице удаляется из группы, для которой GroupGUID (атрибут ObjectGUID в AD) имеет видупоминается из нашей эры.Тем не менее, нет ошибок времени компиляции или времени выполнения, и не отражаются даже какие-либо изменения, и я думаю, что это должно быть связано с проблемой с моим объектом JSON?

1 Ответ

1 голос
/ 02 июля 2019

Первая проблема здесь:

private string UpdateMemberList(JsonResult objMemberUpdate)

Класс JsonResult предназначен для использования в ответе (возвращаемом из действия контроллера), а не в качестве параметра.

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

public class MemberUpdate {
    public string Directory { get; set; }
    public Guid Group { get; set; }
    public List<string> Remove { get; set; }
    public List<string> RemoveAfter { get; set; }
    public string ResultFormat { get; set; }
    public string OnBehalfOf { get; set; }
}

И определение вашего действия будет таким:

public string UpdateMemberList(MemberUpdate objMemberUpdate)

ASP.NET автоматически десериализует JSON, отправленный из браузера, в экземпляр вашего класса.

Тем не менее, я хочу обратиться к тому, что вы сказали:

с использованием System.Management.Automation (не использовать службы каталогов, поскольку в настоящее время новичок в этой библиотеке и изучает ее)

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

Вызов PowerShell из C # ужасен.Я делал это несколько раз, и у меня всегда болит голова.Это означает больше предварительных условий (вам нужен установленный модуль AD), больше вещей, которые нужно сломать, и просто более низкую производительность (так как вы общаетесь с отдельным процессом powershell.exe).

В Интернете есть множество примеровкак добавлять и удалять членов из групп в C #, например здесь - и код в самом вопросе (с использованием System.DirectoryServices), и код в принятом ответе (с использованием System.DirectoryServices.AccountManagement) будут работать.Но использование System.DirectoryServices напрямую, хотя и немного сложнее, всегда работает быстрее, чем System.DirectoryServices.AccountManagement.(Я говорил о том, почему в статье, которую я написал ).

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