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
Прячется под столом...