using System; using System.DirectoryServices; using System.Resources; using MSScriptControl; using System.Collections; namespace mbsh { /// /// The actual shell processor. /// public class CProcessor { public CProcessor(string mbPath) { // Set language m_sLanguage = c_defaultLanguage; // Get a resource manager m_resources = new ResourceManager("Mbsh.Mbsh", System.Reflection.Assembly.GetExecutingAssembly()); // Init the WScript object m_WScript = new CWScript(); // Init the script control InitEngine(c_defaultLanguage); // Set path MBPath = mbPath; } public void DoWork() { m_bWorkDone = false; while (!m_bWorkDone) { try { string s_inputLine; string token; CTokenizer localTok; s_inputLine = ShowPrompt(); localTok = new CTokenizer(s_inputLine, null); token = localTok.GetNextToken(); token = token.ToUpper(); if (String.Equals(token, m_commandPrefix + m_resources.GetString("engCommand"))) { // change the scripting engine if (localTok.NumToks < 2) { throw new CMbshException(m_resources.GetString("engError")); } string language = localTok.GetNextToken(); InitEngine(language); } else if (String.Equals(token, m_commandPrefix + m_resources.GetString("helpCommand"))) { // help command if (localTok.NumToks < 2) { // general help Console.WriteLine(m_resources.GetString("generalHelp")); } else { // specific help Console.WriteLine(m_resources.GetString("specificHelp")); } } else if (String.Equals(token, m_commandPrefix + m_resources.GetString("dirCommand"))) { EnumProps(); } else if (String.Equals(token, m_commandPrefix + m_resources.GetString("setCommand"))) { if (localTok.NumToks < 3) { throw new CMbshException(m_resources.GetString("setError")); } string propName = localTok.GetNextToken(); string propVal = localTok.GetNextToken(); SetProperty(propName, propVal); } else if (String.Equals(token, m_commandPrefix + m_resources.GetString("getCommand"))) { if (localTok.NumToks < 2) { throw new CMbshException(m_resources.GetString("getError")); } GetProperty(localTok.GetNextToken()); } else if (String.Equals(token, m_commandPrefix + m_resources.GetString("cdCommand"))) { //change metabase node if (localTok.NumToks < 2) { throw new CMbshException(m_resources.GetString("cdError")); } ChangeDir(localTok); } else if ((String.Equals(token, m_commandPrefix + m_resources.GetString("exitCommand"))) || (String.Equals(token, m_commandPrefix + m_resources.GetString("quitCommand")))) { // quitting m_bWorkDone = true; } else if (token.StartsWith(m_commandPrefix)) { // unknown command throw new CMbshException(m_resources.GetString("unknownCommand") + token + "\n" + m_resources.GetString("useHelp") + m_commandPrefix + m_resources.GetString("helpCommand")); } else { m_scriptControl.ExecuteStatement(s_inputLine); } } catch(Exception e) { Console.WriteLine(e.Message); } } } private string ShowPrompt() { Console.Write(MBPath + c_promptSuffix); return Console.ReadLine(); } private string m_mbPath = CMbshApp.c_DefaultMBPath; private const string c_promptSuffix = ">"; private const string c_pathDelim = "/"; private char[] c_cPathDelim = {'/'}; private string m_commandPrefix = "."; private const string c_upPath = ".."; private const string c_altPathDelim = "\\"; private bool m_bWorkDone = false; private DirectoryEntry m_dir = null; private ResourceManager m_resources; /// /// Gets the ADSI object for the specified path /// private DirectoryEntry GetPathObject(string sPath) { string s_adsiPath; if (sPath.StartsWith(CMbshApp.c_ConnectString)) { s_adsiPath = sPath; } else { s_adsiPath= CMbshApp.c_ConnectString + sPath; } try { if (DirectoryEntry.Exists(s_adsiPath)) { return new System.DirectoryServices.DirectoryEntry(s_adsiPath); } else { return null; } } catch { return null; } } /// /// MSScriptControl.ScriptControl /// private ScriptControl m_scriptControl; /// /// Default script engine /// private const string c_defaultLanguage = "JScript"; /// /// The active script engine /// private string m_sLanguage; /// /// Initializes m_scriptControl /// private void InitEngine(string language) { // Get the script control m_scriptControl = new MSScriptControl.ScriptControlClass(); try { m_scriptControl.Language = language; m_sLanguage = language; } catch { Console.WriteLine(m_resources.GetString("noLang")); m_scriptControl.Language = m_sLanguage; } m_scriptControl.AllowUI = true; } /// /// Instantiation of WScript object /// private CWScript m_WScript; /// /// Sets a property in the metabase /// private void SetProperty(string propName, string propVal) { PropertyValueCollection propValColl; PropertyCollection collection = m_dir.Properties; try { propValColl = collection[propName]; } catch { throw new CMbshException(m_resources.GetString("invalidProp")); } propValColl.Value = propVal; m_dir.CommitChanges(); } private void ChangeDir(CTokenizer localTok) { string path = localTok.GetNextToken(); path.Replace(c_altPathDelim, c_pathDelim); CTokenizer pathTokens = new CTokenizer(path, c_cPathDelim); string newPath; // absolute path if (path.StartsWith(c_pathDelim)) { newPath = c_pathDelim; } // relative path else { newPath = MBPath; } for (int pathIndex = 0; pathIndex < pathTokens.NumToks; pathIndex++) { string pathToken = pathTokens.GetNextToken(); // ".." if (String.Equals(pathToken, c_upPath)) { int lastSlash = newPath.LastIndexOf(c_pathDelim); newPath = newPath.Remove(lastSlash, newPath.Length - lastSlash); if (0 == newPath.Length) { newPath = c_pathDelim; } } else { if (newPath.EndsWith(c_pathDelim)) { newPath = newPath + pathToken; } else { newPath = newPath + c_pathDelim + pathToken; } } } MBPath = newPath; } /// /// Outputs the value of the selected property /// private void GetProperty(string propName) { PropertyValueCollection propValColl; PropertyCollection collection = m_dir.Properties; try { propValColl = collection[propName]; } catch { throw new CMbshException(m_resources.GetString("invalidProp")); } Console.WriteLine(propValColl.Value.ToString()); } /// /// Outputs all properties at the node /// private void EnumProps() { PropertyValueCollection propValColl; DirectoryEntry propEntry; PropertyCollection collection = m_dir.Properties; // Get the schema entry for the class of our object ActiveDs.IADsClass schemaEntry = (ActiveDs.IADsClass)m_dir.SchemaEntry.NativeObject; Array[] propLists = new Array[2]; propLists[0] = (Array)schemaEntry.MandatoryProperties; propLists[1] = (Array)schemaEntry.OptionalProperties; foreach (Array propList in propLists) { foreach (string propName in propList) { if (!propName.Equals(string.Empty)) { try { propValColl = collection[propName]; // don't do anything if there's no value if (null != propValColl.Value) { string propVal = propValColl.Value.ToString(); if (!propVal.Equals(string.Empty)) { // check if isInherit IISOle.IISPropertyAttribute retVal = null; Object[] invokeArgs = {propName}; try { retVal = (IISOle.IISPropertyAttribute) m_dir.Invoke("GetPropertyAttribObj", invokeArgs); } catch { // ignore the error - check for null below } if (null != retVal) { // check if IsInherit if (!retVal.Isinherit) { string propPath = m_dir.SchemaEntry.Parent.Path + "/" + propName; propEntry = GetPathObject(propPath); ActiveDs.IADsProperty iProp = (ActiveDs.IADsProperty)propEntry.NativeObject; string propSyntax = "(" + iProp.Syntax + ")"; string vpropName = propName.PadRight(30, ' '); Console.Write(vpropName + " : "); string typename = propSyntax.ToUpper().PadRight(10, ' '); Console.Write(typename + " "); Console.WriteLine(propVal); } } } } } catch { Console.WriteLine(m_resources.GetString("noDisplay") + propName); } } } } } private string MBPath { get { return m_mbPath; } set { m_dir = GetPathObject(value); if (null != m_dir) { m_mbPath = String.Copy(value); // need the next line so that the control actually gets reset, even if we haven't used it m_scriptControl.State = MSScriptControl.ScriptControlStates.Connected; m_scriptControl.Reset(); m_scriptControl.AddObject(m_resources.GetString("thisNodeName"), m_dir.NativeObject, true); m_scriptControl.AddObject(m_resources.GetString("WScriptName"), m_WScript, true); return; } m_dir = GetPathObject(m_mbPath); if (null != m_dir) { // throw "can't set path" exception throw new CMbshException(m_resources.GetString("failedADSI") + value + "\n" + m_resources.GetString("succeededADSI") + m_mbPath); } // throw "can't set any path" exception if (String.Equals(value, m_mbPath)) { throw new CMbshException(m_resources.GetString("failedADSI") + value); } else { throw new CMbshException(m_resources.GetString("failedADSI") + value + "\n" + m_resources.GetString("failedADSI") + m_mbPath); } } } } }