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
}
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
}