ModifiedProperties для настраиваемого объекта?

Это можно сделать? Я хочу имитировать поведение ADObject на настраиваемом объекте таким образом, чтобы при изменении свойства оно отображалось в списке "modifiedproperties"

например.

$ADUser = Get-ADUser 'someSamAccountName' -Properties description
$ADUser.Description = 'Changed ...'
$ADUser.ModifiedProperties

Как получить такие же измененные свойства для настраиваемого объекта:

$var = New-Object -TypeName psobject -Property @{ Description = 'value' }
$var.description = 'Changed ...'
$var.ModifiedProperties

2 ответа

В ModifiedProperties Свойство относится к модулю ActiveDirectory, поэтому вы не увидите его на объектах из других модулей.

Если вы действительно хотите отслеживать измененные свойства таким образом, вам нужно будет создать свой собственный класс и разработать сеттеры для обновления ModifiedPropertiesсвойство, определенное в этом новом классе. Вы также можете создать подклассPSObject или PSCustomObjectкоторый использует интерфейс INotifyPropertyChanged, и прослушивает это событие, чтобы отслеживать изменения, внесенные в объект после его первоначальной сборки.

Как уже сказано в ответе выше, это относится к объектам AD.

Я уверен, что это будет разорвано на части, но я подумал, как я могу быстро сделать что-то подобное в PowerShell для вас, используя класс. На самом деле это не скажет вам, с чего изменились значения, но я считаю, что объект AD сообщает вам только об изменении свойства.

$PropertyTracker = @"
namespace PropertyTracker
{
    public class NewItem
    {
        public object Value { get; set; }
        public bool IsDirty { get; set; } = false;

        public NewItem(object value)
        {
            Value = value;
        }

        public override string ToString() 
        {
            return Value.ToString();
        }
    }
}
"@
Add-Type $PropertyTracker

class CustomObject {
    [string[]]$Properties = @()
    [string[]]$ModifiedProperties = @()

    CustomObject() {
        # Add anything you want to construct at the start
    }

    # Method to add a new member
    Add([string]$name, [object]$value) {
        if ($this.Properties -notcontains $name) {
            $newProperty = [PropertyTracker.NewItem]::new($value)
            $this | Add-Member -MemberType NoteProperty -Name $name -Value $newProperty
            $this.Properties += $name
        }
    }

    # Method to update an existing member
    Update([string]$name, [object]$value) {
        $this.PSObject.Properties.Where({ $_.Name -eq $name }).Value.Value = $value
        if ($this.ModifiedProperties -notcontains $name) {
            $this.PSObject.Properties.Where({ $_.Name -eq $name }).Value.IsDirty = $true
            $this.ModifiedProperties = $this.PSObject.Properties.Where({ $_.MemberType -eq "NoteProperty" -and $_.Value.IsDirty -eq $true }).Name
        }
    }
}

$a = [CustomObject]::new()
$a.Add("Name","Ash")
$a.Add("Age",25)
$a.Add("Job","Bad PowerShell Coder")
$a.Add("Salary","Too much")
$a.Add("Country","United Kingdom")
$a.Add("Employment Status","On Thin Ice")
$a.Update("Salary","Null")
$a.Update("Employment Status","Unemployed")
$a
$a.Properties
$a.ModifiedProperties

Прячется под столом...

Другие вопросы по тегам