88 lines
3.4 KiB
C#
88 lines
3.4 KiB
C#
//-----------------------------------------------------------------------
|
|
// <copyright file="SessionConfiguration.cs" company="Microsoft Corporation">
|
|
// Copyright (C) 2011 Microsoft Corporation
|
|
// </copyright>
|
|
//-----------------------------------------------------------------------
|
|
|
|
namespace Microsoft.Samples.Management.OData.RoleBasedPlugins
|
|
{
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Management.Automation;
|
|
using System.Management.Automation.Remoting;
|
|
using System.Management.Automation.Runspaces;
|
|
|
|
/// <summary>
|
|
/// Custom Session configuration implementation
|
|
/// </summary>
|
|
public class SessionConfiguration : PSSessionConfiguration
|
|
{
|
|
/// <summary>
|
|
/// Gets application private data
|
|
/// </summary>
|
|
/// <param name="senderInfo">Sender information</param>
|
|
/// <returns>Always returns null</returns>
|
|
public override PSPrimitiveDictionary GetApplicationPrivateData(PSSenderInfo senderInfo)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets custom initial session state
|
|
/// It relies on the RBAC system to give list of commands allowed for a user
|
|
/// and creates Initial Session state from that
|
|
/// </summary>
|
|
/// <param name="senderInfo">Sender information</param>
|
|
/// <returns>Custom initial Session state</returns>
|
|
public override InitialSessionState GetInitialSessionState(PSSenderInfo senderInfo)
|
|
{
|
|
if (senderInfo == null)
|
|
{
|
|
throw new ArgumentNullException("senderInfo");
|
|
}
|
|
|
|
if (senderInfo.UserInfo == null)
|
|
{
|
|
throw new ArgumentException("senderInfo.UserInfo is null");
|
|
}
|
|
|
|
InitialSessionState initialSessionState = InitialSessionState.CreateDefault();
|
|
foreach (SessionStateCommandEntry command in initialSessionState.Commands)
|
|
{
|
|
command.Visibility = SessionStateEntryVisibility.Private;
|
|
}
|
|
|
|
List<string> scripts = RbacSystem.Current.GetScripts(senderInfo.UserInfo);
|
|
foreach (string script in scripts)
|
|
{
|
|
initialSessionState.Commands.Add(new SessionStateScriptEntry(script));
|
|
}
|
|
|
|
List<string> modules = RbacSystem.Current.GetModules(senderInfo.UserInfo);
|
|
if (modules.Count > 0)
|
|
{
|
|
initialSessionState.ImportPSModule(modules.ToArray());
|
|
}
|
|
|
|
// enable execution of scripts in this process
|
|
System.Environment.SetEnvironmentVariable("PSExecutionPolicyPreference", "unrestricted");
|
|
|
|
List<string> cmdletsFromRbac = RbacSystem.Current.GetCmdlets(senderInfo.UserInfo);
|
|
|
|
// Add all commands from Rbac system to Initial Session State commands
|
|
foreach (string cmdlet in cmdletsFromRbac)
|
|
{
|
|
SessionStateCommandEntry cmdletFromRbac = initialSessionState.Commands.FirstOrDefault(item => string.Equals(item.Name, cmdlet, StringComparison.OrdinalIgnoreCase));
|
|
if (cmdletFromRbac == null)
|
|
{
|
|
throw new ArgumentException("Command not found in InitialSessionState " + cmdlet);
|
|
}
|
|
|
|
cmdletFromRbac.Visibility = SessionStateEntryVisibility.Public;
|
|
}
|
|
|
|
return initialSessionState;
|
|
}
|
|
}
|
|
} |