Powershell запускает пространство защищенных от записи переменных (не может заменить) - PullRequest
0 голосов
/ 03 июля 2018

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

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

SessionState.PSVariable.Set(new PSVariable(paramContainerName, new Dictionary<string, PSObject>(), ScopedItemOptions.Private | ScopedItemOptions.ReadOnly))

Выше можно легко заменить. Кто-нибудь может заменить вышеуказанный словарь на

$ paramContainerName = [] в скрипте powershell или в терминале. Есть ли способ, которым мы можем остановить это.

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Вы можете использовать New-Variable для создания постоянной переменной allscope. Постоянные переменные не могут быть удалены из пространства выполнения и не могут быть установлены после инициализации. AllScope позаботится о том, чтобы переменная не могла быть переопределена в дочерней области. Код выглядит так:

 New-Variable -Name paramContainerName -Value $myReadonlyDictionary  -Option 'AllScope,Constant'

Объединение этого со словарем только для чтения даст вам переменную, которую нельзя изменить в течение сеанса.

0 голосов
/ 03 июля 2018

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

Используйте ReadOnlyDictionary<K,T>, если вы хотите, чтобы никто не мог писать новые записи в него:

var readOnlyDict = new ReadOnlyDictionary<string, PSObject>(new Dictionary<string, PSObject>(){
    { "initKey1", initPSobject1 },
    { "initKey2", initPSobject2 },
});
SessionState.PSVariable.Set(new PSVariable(paramContainerName, readOnlyDict, ScopedItemOptions.Private | ScopedItemOptions.ReadOnly))
...