MOM script for Citrix idle sessions: ? about running shell commands

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Will Seay

    MOM script for Citrix idle sessions: ? about running shell commands

    At the end of this message I've pasted a script we're trying to modify
    slightly. I don't believe it is VBscript or javascript but these are
    the closest groups I could find with my limited programming knowledge.
    Basically, we are trying to add a few lines to this script that will
    execute a few shell commands (see comments at the very end of the
    code). We think this may be ActionScript2 but aren't sure.

    If you can offer any help, or know of a more approrpriate place for me
    to post this message, please let me know. Thanks!

    =============== ============

    / event constants
    var EVENT_TYPE_SUCC ESS = 0;
    var EVENT_TYPE_ERRO R = 1;
    var EVENT_TYPE_WARN ING = 2;
    var EVENT_TYPE_INFO RMATION = 4;

    // WMI constants
    var WBEM_IMPERSONAT E = 3;

    // Citrix WMI constants
    var SESSION_ACTIVE = 0;


    function GenerateEvent(E ventNo, EventType, Message) {
    var MyEvent = ScriptContext.C reateEvent();
    MyEvent.Message = Message;
    MyEvent.EventNu mber = EventNo;
    MyEvent.EventTy pe = EventType;
    MyEvent.EventSo urce = "Citrix MetaFrame";

    ScriptContext.S ubmit(MyEvent);
    }

    function logError(messag e, error)
    {
    var str = SCRIPT_NAME + ":\n" + message;

    if (error)
    {
    var num = (error.number<0 ) ? error.number+0x 100000000 :
    error.number;
    var estr = error.descripti on;

    if (num == 0x80010105)
    estr += " [RPC_E_SERVERFAU LT: The server threw an
    exception.]";
    else if (num == 0x80041001)
    estr += " [WBEM_E_FAILED]";
    else if (num == 0x80010108)
    estr += " [RPC_E_DISCONNEC TED]";
    else if (num == 0x8007007e)
    estr += " [ERROR_MOD_NOT_F OUND: The specified module could
    not be found.]";
    else if (num == 0x80041010)
    estr += " [WBEM_E_INVALID_ CLASS]";
    else if (num == 0x8004100e)
    estr += " [WBEM_E_INVALID_ NAMESPACE]";



    if (estr == "")
    estr = "<error description not given>";


    str += ":\n\tRecei ved error: 0x" + num.toString(16 ) + ": " +
    estr;
    }

    GenerateEvent(2 , EVENT_TYPE_ERRO R, str); }

    function ConvertWMITime( wmitime)
    {
    var year = wmitime.substri ng(0, 4);
    var month = wmitime.substri ng(4, 6) - 1;
    var day = wmitime.substri ng(6, 8);
    var hour = wmitime.substri ng(8, 10);
    var minute = wmitime.substri ng(10, 12);
    var second = wmitime.substri ng(12, 14);

    var date = new Date(year, month, day, hour, minute, second);
    return date;
    }

    function Main()
    {
    // script should only be run in response to a timed event
    if (!ScriptContext .IsEvent()) {
    GenerateEvent(1 , EVENT_TYPE_ERRO R, SCRIPT_NAME +
    ": this script can only be run in response to an event");
    return;
    }

    // parse parameters: 'limit' is the number of minutes the session
    // must have been idle before an event is generated
    var limit;
    try {
    limit = ScriptContext.P arameters.Get(" limit");
    } catch (e) {
    logError("Can't retrieve script parameter", e);
    return;
    }

    // coerce into an integer
    var nrminutes = parseInt(limit) ;
    if (isNaN(nrminute s) || nrminutes <= 0) {
    logError("`limi t' parameter (" + limit +
    ") is not a valid positive number");
    return;
    }

    // first, retrieve all instances of MetaFrame_Sessi on
    var locator, service, sessionobj;
    try {
    locator = new ActiveXObject(" WbemScripting.S WbemLocator");
    service = locator.Connect Server("", "root/Citrix");
    sessionobj = service.Get("Me taFrame_Session ");
    sessionobj.Secu rity_.impersona tionLevel = WBEM_IMPERSONAT E;
    } catch (e) {
    logError("WMI error retrieving session object", e);
    return;
    }

    var instances;
    try {
    instances = sessionobj.Inst ances_();
    } catch (e) {
    logError("WMI error retrieving session instances", e);
    return;
    }


    // next check the idle time of active sessions and raise an event
    // if it exceeds the limit given in the parameter
    try {
    // gratuitous access to Count to generate error if instances
    // can't be retrieved
    var nrsessions = instances.Count ;

    var e = new Enumerator(inst ances);
    for (; !e.atEnd(); e.moveNext()) {
    var session = e.item();


    if (session.Sessio nState != SESSION_ACTIVE)
    continue;

    var last = ConvertWMITime( session.LastInp utTime);
    var now = ConvertWMITime( session.Current Time);

    var diff = (now.getTime() - last.getTime()) / (1000 * 60);

    if (diff > nrminutes) {

    var user = "(unknown user)";
    try {
    var userobj = service.Get(ses sion.SessionUse r);
    userobj.Securit y_.impersonatio nLevel =
    WBEM_IMPERSONAT E;
    user = userobj.UserNam e;
    } catch (e) {
    }

    var ev = ScriptContext.C reateEvent();
    ev.EventNumber = EVENT_ID;
    ev.EventType = EVENT_TYPE_ERRO R;
    ev.EventSource = "Citrix MetaFrame";
    ev.Message = "Session " + session.Session ID + " for
    user " +
    user + " has been idle for too long.";
    ev.UserName = user;
    ev.SetEventPara meter(session.S essionID);
    ev.SetEventPara meter(Math.roun d(diff));
    ev.SetEventPara meter(nrminutes );
    ScriptContext.S ubmit(ev);

    // XXXXXXXXXXXXXXX CHANGE TO INSERT HERE XXXXXXXXXXXXXXX XXXXXXX
    // We need to change this script so that instead of running the
    // commands above (that write an entry to the Event Log), it instead
    // executes some external shell commands. It would look something
    like
    // this in VB script:
    //
    // oShell.Run("c:\ utils\pskill winword.exe %username%")
    // oShell.Run("c:\ utils\pskill excel.exe %username%")
    //
    // XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX


    }
Working...