彙整

Posts Tagged ‘VB Script’

【DC+Exchange 2003】網域內使用郵件通知密碼到期的User(續–實作)

2010 年 12 月 23 日 14 留言

暨昨日所寫的 [DC+Exchange 2003]網域內檢查密碼狀態及使用郵件通知密碼到期的User

使用郵件通知密碼到期 的部分,所實作的後續內容。

緣由:

  • 因為User通常不會知道或是根本就不會去記憶要如何變更密碼。
  • 所以,在郵件通知的內容中,最好能加入了一個變更密碼的URL。
  • 考慮到外地出差的同仁也能遠端上網連線來變更密碼,
  • 所以,最簡單的作法就是:在OWA的網路路徑下增加一網路捷徑和變更密碼的網頁。

閱讀更多…

分類:MIS維護 標籤:, , ,

【DC+Exchange 2003】網域內檢查密碼狀態及使用郵件通知密碼到期的User

2010 年 12 月 22 日 2 留言
分類:MIS維護 標籤:, , ,

列出本地計算機上已經安裝的Hotfix

2008 年 10 月 30 日 發表留言

由於 Windows 2000 Server 的[新增移除程式]中沒有[最近更新]選項,安全性更新也無法集中顯示微軟的 Hotfixs,有時候想檢查一下該Server是否有最新的安全性更新,實在是很麻煩。(Windows XP/2003 以上可以勾選[最近更新],並能集中歸類方便查看。)

以下的資料雖然有點舊,但是需要時還是能增加一些方便。

文章來源:枚舉本地計算機上已經安裝的Hotfix

(原帖的討論: http://www.winmag.com.cn/forum/itemdisplay.asp?boardid=5&id=501485

討論區的程式碼比較完整,節錄如下:

在%systemroot%下會有hotfix安裝的時候產生的log,類似KB839645.log
也可以將下面的腳本保存為.vbs,執行它。

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
  & "{impersonationLevel=impersonate}!\\" _
  & strComputer & "\root\cimv2")
Set colQuickFixes = objWMIService.ExecQuery _
  ("Select * from Win32_QuickFixEngineering")
Set objFS = CreateObject("Scripting.FileSystemObject")
Set objNewFile = objFS.CreateTextFile("InstallHotfixes.htm")
objNewFile.WriteLine "<html>"
objNewFile.WriteLine "<head>"
objNewFile.WriteLine "<title>Installed Hotfixes Report</title>"
objNewFile.WriteLine "</head>"
objNewFile.WriteLine "<body>"
objNewFile.WriteLine "<h3>Hotfixes Report -- Date: " _
  & Now() & "</h3>" & vbCrLf
objNewFile.WriteLine "<table style=font-size:9pt border=1>"
objNewFile.WriteLine "<tbody><tr>"
objNewFile.WriteLine "<td>Computer: </td>"
objNewFile.WriteLine "<td>Description:</td>"
objNewFile.WriteLine "<td>Hotfix ID:</td>"
objNewFile.WriteLine "<td>Installation Date:</td>"
objNewFile.WriteLine "<td>Installed By:</td>"
objNewFile.WriteLine "</tr>"
For Each objQuickFix in colQuickFixes
  objNewFile.WriteLine "<tr>"
  objNewFile.WriteLine "<td>" _
   & objQuickFix.CSName & "</td>"
  objNewFile.WriteLine "<td>" _
   & objQuickFix.Description & "</td>"
  objNewFile.WriteLine "<td>" _
   & objQuickFix.HotFixID & "</td>"
  objNewFile.WriteLine "<td>" _
   & objQuickFix.InstallDate & "</td>"
  objNewFile.WriteLine "<td>" _
   & objQuickFix.InstalledBy & "</td>"
  objNewFile.WriteLine "</tr>"
Next
objNewFile.WriteLine "</tbody></table>"
objNewFile.WriteLine "<body>"
objNewFile.WriteLine "<html>"
objNewFile.Close
Set objShell = Wscript.CreateObject("Wscript.Shell")
objShell.Run "InstallHotfixes.htm"

PS:記得將<>及空白的全型改成半型,

分類:MIS維護 標籤:,

更改本地管理員密碼的腳本(修)

2008 年 10 月 27 日 2 留言

參考資料:

  1. 更改本地管理員密碼的腳本(Winmag亞洲技術社區)
  2. 運行腳本權限問題! – 微軟中文技術論壇(MSDN and TechNet)
  3. 更改 Windows 本地管理員密碼(微軟中國)
  4. 在域控制器上如何一次修改屬於這個域的計算機的管理員密碼?-by gnaw0725
  5. GPUpdate 刷新组策略设置(使组策略立即生效) — Windows XP/2003 以上 (2008-10-27 新增)

討論內容節錄如下:(參考資料1)

Dim oWshNetwork
Set oWshNetwork = WScript.CreateObject("WScript.Network")

Dim strComputer
strComputer = oWshNetwork.ComputerName
'WScript.Echo strComputer

Set objUser = GetObject("WinNT://" & strComputer & "/Administrator, user")
objUser.SetPassword "testpassword"
objUser.SetInfo

微軟的範例:(參考資料3,4)

'Changing the Local Administrator Password.vbs
'*****************************************************
'
' file: Changing the Local Administrator Password.vbs
' Author: Microsoft
'
'*****************************************************
strComputer = "."
Set objUser = GetObject("WinNT://" & strComputer & "/Administrator,user")
objUser.SetPassword "testpassword"
objUser.SetInfo

——————————————————以下2008-10-27新增
或者寫一個 Batch File 內容如下: (假設命名為 ChangeAdminPW.BAT)

@echo off

NET USER Administrator testpassword

  • 再將該 Batch file or VBS放置在 \\{DC}\sysvol\{domain}\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\USER\Scripts\Logon
  • 進入 群組物件編輯器 –>GPO 的 使用者設定 –> Windows 設定 –> 指令碼 – (登入/登出) –> 登入 –> 新增
  • GPO更改完成之後,可在 CMD 下輸入以下指令,使更新過的GPO策略立即生效。(參考資料4)
    • 以下指令 Windows 2000 Server 適用
      secedit /refreshpolicy MACHINE_POLICY
    • 以下指令 Windows 2003 Server 適用
      gpupdate /force 
  • 在DC共享出去的 netlogon 文件夾上,注意domain computers是否有加到權限表裡。(參考資料2) --感謝changdiao的提醒,此段文字內容我沒有詳加確認就放上去,在此刪除。(2008-11-17)
  • 以下是 Netlogon 的相關權限畫面:(僅供參考,方便爾後對照 – 2008-11-17)imageimageimage
    • 一般只要是網域的User,登入之後就會執行。Everyone 只要給 Read 權限即可。Authenticated Users 的 Default 權限如上圖。
  • 以上作法,每登入一次就會執行一次。

———————————————–以上2008-10-27新增及修改

以上密碼為明碼, 也可使用下列二種工具來編碼之後,再設定在GPO上:
1.可使用 Script Encoder 來編碼 (Screnc.exe)

2.可使用 VBS2EXE 工具編譯成EXE

分類:MIS維護 標籤:, , ,

VBS代碼自動把客戶端加入你的網域

2008 年 10 月 06 日 發表留言

文章來源: http://www.winmag.com.cn/forum/itemdisplay.asp?boardid=24&id=704213

內容如下:

個人整理的,平時也有在用,切實可行,按照你的需要修改吧,把下列代碼拷貝到寫字板中,另存為: **.vbs,要用時雙擊就好了,是IT的都看懂:

可以實現:

  1. 自定議電腦名稱
  2. 自動加入網域
  3. 自動添加 域賬號 客戶機 POWER USER權限
  4. 刪除 本機 ADMINISTRATORS中除 ADMINISTRATOR DOMAIN ADMIN以外的帳號
  5. 修改本機 ADMINISTRATOR密碼為 自己想要的密碼
'********************** '定義數據 '**********************
Dim reval 
Dim computer_name1 
Dim computer_name2 
Dim computer_name3 
Dim computer_name4 
Dim computer_name5 
'********************** 
'電腦名稱命名規則 
'********************** 
MsgBox "行政公關:0210-英文名;財務會計:0220-英文名;" _
     & "機構工程:0710-英文名;電子測試:0730-英文名;" _
     & "新產品:0800-英文名",vbokcancel+vbexclamation, _
       "電腦名稱命名規則!" 
'********************** 
'用戶自定義電腦名稱 
'********************** 
Set objnet = CreateObject ("WScript.Network") 
Set R = CreateObject("WScript.Shell") 
reval = InputBox ("你當前的電腦名稱是:" _
     & objnet.ComputerName,"請輸入新的電腦稱:") 
'********************** 
'存儲變量 
'********************** 
computer_name1 = reval 
computer_name2 = reval 
computer_name3 = reval 
computer_name4 = reval 
computer_name5 = reval 
'********************** 
'修改電腦名稱 
'********************** 
On Error Resume Next 
strComputer = "." 
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2") 
Set colComputers = objWMIService.ExecQuery _
    ("Select * from Win32_ComputerSystem") 
For Each objComputer in colComputers 
    errReturn = ObjComputer.Rename (computer_name1) 
  ' If reval <> "" Then 
  '    return=MsgBox ("請按確定重新啟動電腦", vbokcancel+vbexclamation, "注意!") 
  '    If return=vbok Then 
  '       R.run("Shutdown.exe -r -t 0") 
  '    End if 
  ' End If 
Next 
'********************** 
'加入XXXXX-CHINA域 
'********************** 
'* http://support.microsoft.com/kb/222525 
'* MAIL: tjq_wzy@hotmail.com 
'********************** 
'strDomain需更改成自己域名 
'strPassword及strUser具有權限加域的密碼及用戶 
'********************** 
Const JOIN_DOMAIN = 1 
Const ACCT_CREATE = 2 
Const ACCT_DELETE = 4 
Const WIN9X_UPGRADE = 16 
Const DOMAIN_JOIN_IF_JOINED = 32 
Const JOIN_UNSECURE = 64 
Const MACHINE_PASSWORD_PASSED = 128 
Const DEFERRED_SPN_SET = 256 
Const INSTALL_INVOCATION = 262144 
strDomain = "xxxxx-china.cn" 
strPassword = "xxxxx-china" 
strUser = "admin" 
'有domain admins權限的用戶及密碼 
Set objNetwork = CreateObject("WScript.Network") 
strComputer = objNetwork.ComputerName 
Set objComputer = GetObject("winmgmts:" _ 
    & "{impersonationLevel=Impersonate}!\\"& _
    strComputer & "\root\cimv2:Win32_ComputerSystem.Name='" & _
    strComputer & "'") 
Returnvalue = objComputer.JoinDomainOrWorkGroup(strDomain, _
    strPassword, strDomain & "\" & strUser, NULL, _
    JOIN_DOMAIN + ACCT_CREATE) 
wscript.echo "已成功加入xxxxx-CHINA.CN域!" 
' wscript.echo "Pls. Reset Your Computer!" 
'******************************* 
'添加用戶到POWER USERS群組 
'以下第二句WinNT://後為自己的域名 
'******************************* 
dim myname 
myname = InputBox ("請輸入你申請賬號時的英文名稱,輸入錯誤將不能登錄:","自定義開機用戶名!") 
Set objGroup = GetObject("WinNT://" & computer_name2 & "/Power Users") 
Set objUser = GetObject("WinNT://xxxxx-china/" & myname) 
objGroup.Add(objUser.ADsPath) 
'*********************************** 
'刪除本地ADMINISTRATORS組中的其它成員 
'除administrator 及 Domain Admins 
'*********************************** 
Set objGroup = GetObject("WinNT://" & computer_name3 & "/Administrators") 
For Each objUser In objGroup.Members 
If objUser.Name <> "Administrator" AND objUser.Name <> "Domain Admins" Then 
   Wscript.Echo "刪除ADMIN群組賬號:" & objUser.Name 
   objGroup.Remove(objUser.AdsPath) 
End If 
Next 
'*********************************** 
'修改本機管理員ADMINISTRATOR的密碼 
'*********************************** 
'下面第三句引號部分為密碼字符 
'*********************************** 
strComputer = "computer_name5" 
Set objUser = GetObject("WinNT://" & strComputer & "/Administrator, user") 
objUser.SetPassword "ks_its_" 
objUser.SetInfo 
'*********************************** 
'所有操作完成重新啟動電腦 
'*********************************** 
'wscript.echo "所有的操作完成,將重新啟動電腦!" 
'Set objWMIService = GetObject("winmgmts:" _
'    & "{impersonationLevel=impersonate,(Shutdown)}!\\" _
'    & computer_name4 & "\root\cimv2") 
'Set colOperatingSystems = objWMIService.ExecQuery _ 
'    ("Select * from Win32_OperatingSystem") 
'For Each objOperatingSystem in colOperatingSystems 
'    ObjOperatingSystem.Reboot() 
'Next 
return=MsgBox ("所有的操作完成,將重新啟動電腦!",vbokcancel+vbexclamation,"注意!") 
If return=vbok Then 
   R.run("Shutdown.exe -r -t 0") 
End if 
'******************** 
'end 
'******************** 

修改 Administrator 的密碼該程式段值得參考, 先收錄之.

分類:MIS維護 標籤:,

如何刪除舊的電腦帳戶

2008 年 10 月 02 日 發表留言

文章來源: 聖哥的資訊站 [技術]如何刪除舊的電腦帳戶

如果網域中的電腦常常變更電腦名稱,或者經常有新的電腦加入網域,或者重新安裝網域成員電腦,會造成 Active Directory 中 Computer 容器下的電腦帳戶愈來愈多,以下 script 可以用來處理這個問題:

代碼:

On Error Resume Next
Set objOU = GetObject("LDAP://CN=Computers,DC=mcg,DC=com")
objOU.Filter = Array("Computer")
For Each objComputer in objOU
 Set objPC = GetObject(objComputer.ADsPath)
 Set objLastLogon = objPC.Get("lastLogonTimestamp")
 intLastLogonTime = objLastLogon.HighPart * (2^32) + _
                     objLastLogon.LowPart
 intLastLogonTime = intLastLogonTime / (60 * 10000000)
 intLastLogonTime = intLastLogonTime / 1440
 StrTime = intLastLogonTime + #1/1/1601#
 dtmEndingDate = strTime
 intDays = DateDiff("d", dtmEndingDate, Now)
 If (intDays > 60) And (intDays < 90) Then
   ' 停用 60 天以上到 90 天內未登入的電腦帳戶
   WScript.Echo "停用 " & objComputer.CN & " " _
                   & strTime & " " & Intdays
   objPC.AccountDisabled = True
   objPC.SetInfo
 ElseIf intDays > 90 Then
   ' 刪除超名 90 天未登入的電腦帳戶
   WScript.Echo "刪除 " & objComputer.CN & " " _
                   & strTime & " " & Intdays
   objPC.DeleteObject(0)
 End If
Next

引言回覆:

想請問聖哥,我使用您所給予的Script去刪除舊電腦,但是發現,他會連剛加入網域的電腦或是還在線上的電腦帳號都會一起刪除,請問是不是我還需要針對那邊的程式碼進行修改呢?

測試過後, 發現是intLastLogonTime這一段的計算有問題, 計算出來數值是"0″ , 於是StrTime的值變成1/1/1601 , 於是所有主機都被判斷為超過90天未曾登入, 全部被刪掉…… 可是我也不太會改…………

該程式段 似乎有問題, 待測試…

分類:MIS維護 標籤:,

如何撰寫SCRIPT確認分享檔案的權限?

2008 年 10 月 02 日 發表留言

無意中逛到 聖哥的資訊站 看到這篇文章,原問題內容:

——————————– b8442030 發表於: 星期五 九月 26, 2008 11:53 pm

聖哥您好….

我想要撰寫SCRIPT….

透過SCHEDULE JOB去執行SCRIPT….

SCRIPT內容是去CHECK本機電腦所分享的資料夾中….

是否有分享資料夾有EVERYONE FULL CONTROL的權限….

如果有就寫記錄到DATABASE…. 這部分該怎麼撰寫??

回答如下:

——————————- cheneyen 發表於: 星期六 九月 27, 2008 9:21 am

這應該是你要的…

我想你搞不好下一步是被要求怎樣變更預設分享權限…

好像看到有人再走我們以前走的路@@"

代碼:

Set objWMIService = GetObject("winmgmts:_
  {impersonationLevel=impersonate}!\\.\root\cimv2")
Set colShare= objWMIService.ExecQuery("Select * from _
  Win32_Share where _
  name<>'print$' and type='0'")
For Each oSh in colShare
  Set objShareSecs = objWMIService.ExecQuery("Select * From _
      Win32_LogicalShareSecuritySetting Where_
      Name='" & oSh.Name & "'")
For Each oShareSec in objShareSecs strShareName = oSh.Name
  strSharePath = oSh.Path
  RetVal = oShareSec.GetSecurityDescriptor(strShareName)
  oDACL = strShareName.DACL
 For Each oACE in oDACL
  Set Trustee = oACE.Trustee
  Select Case oACE.AccessMask
  Case 1179817,1966313,1179785
   strUserRight = "read"
  Case 1245631
   strUserRight = "change"
  Case 2032127
   strUserRight = "FULL_CONTROL"
  Case Else
   strUserRight = oACE.AccessMask
  End Select
 Next
Next
Next

PS.

  1. 有上顏色的部份,代表還需要確認的地方。
  2. 內容應該先有一Database,尚未確認是哪種資料庫和結構。
  3. 不知道有沒有比較好的處理"程式代碼"的方式?這樣貼上很難觀看
分類:MIS維護 標籤:, ,
%d 位部落客按了讚: