背景:
我们有一个webapp,用户可以自助提交访问指定服务器(群)的请求,审批后webapp会调用后台脚本在指定服务器(群)上批量创建账号密码,用户在该时间窗口内可以REMOTE到指定服务器(群)做维护工作。
原做法:
EMAIL账号密码给用户后,用户通过手工方式远程登录,缺点是麻烦易错,用户可以接受但体验不好。
新做法:
自动化。将远程登录指令包装后生成页面链接,用户点击链接后将启动REMOTE并登陆到服务器,缺点是涉及ActiveX,故仅支持IE浏览器,但避免了用户手工的麻烦和出错。
技术方案是将下面代码包装成mstsc.bat:
cmdkey /delete:TERMSRV/%1
cmdkey /generic:TERMSRV/%1 /user:%3\\%4 /pass:%5
start mstsc /v:%1:%2
调用方式:mstsc.bat ip, port, host, user, pass,经测试可行。
OK,用JavaScript将脚本包装起来如下:
String.format = function() {
if (arguments.length == 0)
return null;
var str = arguments[0];
for (var i = 1; i < arguments.length; i++) {
var reg = new RegExp('\\{' + (i - 1) + '\\}', 'gm');
str = str.replace(reg, arguments[i]);
}
return str;
};
function lunchRdp(ip, port, host, user, pass) {
var atxObj = null;
if (window.ActiveXObject) {
try {
atxObj = new ActiveXObject("WScript.Shell");
// command template
var deleteTempl = "cmdkey /delete:TERMSRV/{0}";
atxObj.Run(deleteTempl.format(ip));
var genericTempl = "cmdkey /generic:TERMSRV/{0} /user:{1}\\{2} /pass:{3}";
atxObj.Run(genericTempl.format(ip, host, user, pass));
var mstscTempl = "mstsc /v:{0}:{1}";
atxObj.Run(mstscTempl.format(ip, port));
} catch (e) {
alert("Runtime exception occurred, please retry or contact sysadmin.");
}
} else {
alert("IE/IE-embedded browser for this function only.");
}
};
以上,IE8测试通过。
您有任何问题或建议, 请给我写邮件。