Вот упрощенный пример кода:
Код: Выделить всё
var iss = InitialSessionState.CreateRestricted(SessionCapabilities.Language);
iss.LanguageMode = PSLanguageMode.FullLanguage; // ConstrainedLanguage would inhibit the callbacks
// Add specific cmdlets, for example
iss.Commands.Add(new SessionStateCmdletEntry("New-Object", typeof(Microsoft.PowerShell.Commands.NewObjectCommand), ""));
iss.Commands.Add(new SessionStateCmdletEntry("Select-Object", typeof(Microsoft.PowerShell.Commands.SelectObjectCommand), ""));
// Create runspace
using var rs = RunspaceFactory.CreateRunspace(iss);
rs.Open();
// Provide a limited callback object
IMySafeCallbacks callbacks = new MySafeCallbacks();
rs.SessionStateProxy.SetVariable("callbacks", callbacks);
// Run the PowerShell script
using var ps = PowerShell.Create();
ps.Runspace = rs;
ps.AddScript(@"$callbacks.LogMessage('Hello from script');");
var results = ps.Invoke();
- Ограничить доступ: сценарии должны иметь возможность вызывать только определенныеметоды в интерфейсе IMySafeCallbacks без доступа к другим
.NET-типам или системным ресурсам. - Предотвратите несанкционированный доступ: избегайте раскрытия каких-либо возможностей для
сценарий для доступа к системным ресурсам (например, для чтения/записи файлов) или создания произвольных объектов.
- Если я использую PSLanguageMode.ConstrainedLanguage, сценарий завершается с ошибкой при
вызове методов в интерфейсе обратного вызова из-за ограниченной
поддержки типа .NET. - В PSLanguageMode.FullLanguage нет простого способа
предотвратить доступ к операциям файловой системы или созданию произвольного объекта .NET
с помощью таких методов, как New-Object или [System.IO.File] ].
Как настроить пространство выполнения PowerShell для ограничения доступные командлеты и методы строго соответствуют тем, которые определены в моем интерфейсе IMySafeCallbacks? Есть ли способ разрешить вызов только определенных методов моего приложения, блокируя при этом доступ к конфиденциальным системным операциям? Или способ разрешить вызов IMySafeCallbacks даже в PSLanguageMode.ConstrainedLanguage?
Будем очень признательны за любые рекомендации или примеры кода о том, как безопасно ограничить PowerShell SDK в этом сценарии!
Подробнее здесь: https://stackoverflow.com/questions/791 ... back-metho