/**
* @name CeL function for Windows
* @fileoverview
* 本檔案包含了 Windows 系統管理專用的 functions。
* @since
*/
'use strict';
if (typeof CeL === 'function')
CeL.run(
{
name : 'application.OS.Windows',
code : function(library_namespace) {
/**
* null module constructor
* @class web 的 functions
*/
var _// JSDT:_module_
= function() {
// null module constructor
};
/**
* for JSDT: 有 prototype 才會將之當作 Class
*/
_// JSDT:_module_
.prototype = {
};
// --------------------------------------------------------
// 在 .hta 中, typeof WScript==='undefined'.
// http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/reference/objects/shell/application.asp
// http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/programmersguide/shell_intro.asp
// 用 IE 跑 ActiveXObject 可能會出現 ActiveX 指令碼的警告,須更改「允許主動式內容在我電腦上的檔案中執行」或改用 Mark of the Web。
// IE 工具→「網際網路選項」→「進階」→「安全性」→「允許主動式內容在我電腦上的檔案中執行」
_// JSDT:_module_
.
// for Microsoft Windows Component Object Model.
// http://blogs.msdn.com/b/ericlippert/archive/2004/06/01/145686.aspx
// http://technet.microsoft.com/library/ee156598.aspx
new_COM = typeof WScript === 'object' ? function(id) {
// http://msdn.microsoft.com/en-us/library/xzysf6hc(v=vs.84).aspx
return WScript.CreateObject(id);
} : typeof ActiveXObject === 'function' ? function(id) {
// e.g., in HTA
return new ActiveXObject(id);
} : typeof Server === 'object' && Server.CreateObject && function(id) {
return Server.CreateObject(id);
};
// CeL.application.OS.Windows.no_COM
if (_.no_COM = !_.new_COM && 'No Component Object Model support!') {
if (false && !library_namespace.env.ignore_COM_error)
library_namespace.warn('new_COM: no Component Object Model support!');
(_.new_COM = function(id) {
// 忽略沒有 Windows Component Object Model 的錯誤。
if (!library_namespace.env.ignore_COM_error)
throw new Error('new_COM: No method to get Microsoft Component Object Model (COM): [' + id + ']! You may need to set `CeL.env.ignore_COM_error = true`!');
});
return _;
}
// WScript.Echo((_.no_COM? '沒' : '') + '有 Windows Component Object Model。');
/**
* test if is a COM.
* 經驗法則。並非依照規格書。
*
* @param object
* object to test
* @returns {Boolean} is a COM.
*/
function is_COM(object) {
try {
if (library_namespace.is_Object(object)
&& '' === '' + object
&& typeof object.constructor === 'undefined'
) {
var i;
for (i in object) {
return false;
}
try {
i = String(object);
return false;
} catch (e) {
return true;
}
}
return false;
} catch (e) {
// TODO: handle exception
}
}
_// JSDT:_module_
.
is_COM = is_COM;
var HTA;
/**
* Are we run in HTA?
* ** HTA 中應該在 DOM ready 後呼叫,否則 document.getElementsByTagName 不會有東西!
* @param {String}[id] HTA tag id (only used in low version that we have no document.getElementsByTagName)
* @return We're in HTA
* @require library_namespace.is_WWW
* @since 2009/12/29 19:18:53
* @_memberOf _module_
* @see
* http://msdn2.microsoft.com/en-us/library/ms536479.aspx
* http://www.microsoft.com/technet/scriptcenter/resources/qanda/apr05/hey0420.mspx
* http://www.msfn.org/board/lofiversion/index.php/t61847.html
* lazy evaluation
* http://peter.michaux.ca/articles/lazy-function-definition-pattern
*/
function get_HTA(id) {
if (!library_namespace.is_HTA)
return;
if (library_namespace.is_WWW(true)) {
HTA = document.getElementsByTagName('APPLICATION')[0];
} else
HTA = library_namespace.is_WWW() && id && document.all && document.all[id];
return HTA;
};
library_namespace.set_initializor(get_HTA, _);
function parse_command_line(command_line, no_command_name){
// TODO: "" 中的判別仍有問題。
var args = [], re = no_command_name ? /\s+("([^"]*)"|(\S+))/g
: /\s*("([^"]*)"|(\S+))/g, result;
// commandLine 第一引數為 full script name
while (result = re.exec(command_line))
args.push(result[3] || result[2]);
return args;
}
//get_WScript_object();
//get_WScript_object[generateCode.dLK]='is_WWW,get_HTA,WSH,dirSp'.split(',');
//get_WScript_object[generateCode.dLK].push('*var args,WshShell,WinShell,WinShell,fso;get_WScript_object();');
var WSH, WshShell = "WScript.Shell", WinShell = "Shell.Application", FSO = "Scripting.FileSystemObject", args;
var log_message;
/**
*
* @param HTML_only
*/
function get_WScript_object(HTML_only) {
var i;
if (typeof WshShell === 'string') {
//library_namespace.debug('Initializing using ' + _.new_COM, 1, 'get_WScript_object');
try {
WshShell = _.new_COM(WshShell);
WinShell = _.new_COM(WinShell);
FSO = _.new_COM(FSO);
} catch (e) {
if ((e.number & 0xFFFF) === 429)
// Automation 伺服程式無法產生物件
// Run-Time Error '429' OLE Automation Server Can't Create Object
// 把 HTA 當作 HTML?
throw e;
library_namespace.error(e);
}
//library_namespace.debug(typeof FSO, 1, 'get_WScript_object');
} else
library_namespace.debug('Already initialized!', 1, 'get_WScript_object');
if (typeof WScript === 'object'
// && typeof WScript.constructor=='undefined'
) {
// Array.from()
args = Array.prototype.slice.call(WScript.Arguments);
// Microsoft Windows Script Host (WSH)
i = (WSH = WScript.FullName).lastIndexOf(library_namespace.env.path_separator);
if (i !== -1)
WSH = WSH.slice(i + 1);
} else if (
!(typeof HTML_only === 'undefined' ? library_namespace.is_WWW() && !_.get_HTA() : HTML_only)// !HTML_only//
&& typeof ActiveXObject !== 'undefined')
try {
if (i = _.get_HTA()){
args = parse_command_line(i.commandLine);
// default HTA host is mshta.exe.
WSH = 'mshta.exe';
}
} catch (e) {
}
// 判斷假如尚未load則排入以確定是否為HTA
else if (library_namespace.is_WWW(1) && !_.get_HTA()
// && !document.getElementsByTagName('body').length
)
setTimeout(function() {
get_WScript_object(HTML_only);
}, 100);
try {
// CScript.exe only
// var stdout = FSO.GetStandardStream(1);
// var stderr = FSO.GetStandardStream(2);
log_message = function(message) {
// stdout.WriteLine(message);
// WScript.StdOut.Write(message);
WScript.StdOut.WriteLine(message);
};
} catch (e) {
// using WScript.exe
log_message = function(message) {
WScript.Echo(message);
};
}
// WScript.StdIn.ReadLine()
/*
* @cc_on @if(@_jscript_version >= 5) // JScript gives us Conditional
* compilation, we can cope with old IE versions. // and security blocked
* creation of the objects. ;//else.. @end@
*/
i = {
WshShell : WshShell,
WinShell : WinShell,
FSO : FSO,
args : args,
WSH : WSH
};
if(HTML_only)
throw i;
return i;
};
library_namespace.set_initializor(get_WScript_object, _);
/* 2007/11/17 23:3:53
使用 ADSI (Active Directory Service Interface) 存取資料
http://support.microsoft.com/kb/234001
http://www.dbworld.com.tw/member/article/010328b.htm
http://support.microsoft.com/kb/216393
*/
function addUser(name,pw,group,computer){
// http://msdn.microsoft.com/library/en-us/script56/html/wsmthenumprinterconnections.asp
;
// 連上伺服器
var oIADs,o;
// 利用Create指令,指定產生一個新的使用者類別,以及使用者帳號的名稱。使用SetInfo的指令將目錄服務中的資料更新。
try{oIADs=new Enumerator(GetObject(computer='WinNT://'+(computer||(new_COM('WScript.Network')).ComputerName)));}catch(e){}//WScript.CreateObject('WScript.Network')
if(oIADs){//try{
if(name){
try{o=oIADs.Create('user',name);}catch(e){o=new Enumerator(GetObject(computer+'/'+name));}
o.SetPassword(pw),/*o.FullName=name,o.Description=name,*/o.SetInfo();
// Administrators
if(group)(new Enumerator(GetObject(computer+'/'+group))).Add(o.ADsPath); // o.ADsPath: computer+'/'+name
return o; // 得到用戶
}
//oIADs.Filter=['user'];//new VBArray('user'); // no use, 改用.AccountDisabled
o={};
// http://msdn2.microsoft.com/en-us/library/aa746343.aspx
// 對所有的oIADs,通常有Name,Description
for(var i,j,a,b,p='Name,AccountDisabled,Description,FullName,HomeDirectory,IsAccountLocked,LastLogin,LoginHours,LoginScript,MaxStorage,PasswordExpirationDate,PasswordMinimumLength,PasswordRequired,Profile'.split(',');!oIADs.atEnd();oIADs.moveNext())if(typeof oIADs.item().AccountDisabled==='boolean'){
for(i=oIADs.item(),j=0,a={};j