2011年3月22日 星期二

寫支自動通報 Windows Tasks 執行結果的程式

Server 上通常都掛載了一堆的 Windows Tasks
當每天要監控一堆 Server 的 Windows Tasks 就是件累人的事
透過 VB.NET 寫一支自動通報執行結果的程式
把各 Server 的 Windows Tasks 執行結果 Email 出來
應該會省點功...

首先利用 schtasks.exe 將 Windows Tasks 的執行狀況匯出為 csv
所以我寫了一隻 .bat 來做這件事
要注意的是, 我這邊實現的環境是 Windows Server 2003
Win7 的 schtasks.exe 匯出的格式和 Windows Server 2003 不太相同
如果要在 Winy 環境上實現, 可能要再花一些時間分析匯出的 csv

TasksToCSV.bat 的內容 :
   schtasks -query -fo csv -v > Tasks.csv

接下來就是 Coding Time 了
就僅針對產生 csv 及擷取內容的方法記錄
Imports System.IO
Imports System.Diagnostics
Imports System.Text

Private Sub GenerateTaskCSV()
   ' 清除舊的 CSV
   Dim fiCSV As New FileInfo(Directory.GetCurrentDirectory() & "\Tasks.csv")
   If fiCSV.Exists = True Then
      fiCSV.Delete()
   End If

   ' 將 Windows Tasks 匯入新的 CSV
   Dim p As Process = Process.Start("TasksToCSV.bat")
   ' 等待 .bat 執行結束
   p.WaitForExit()
End Sub

Private Function GetMailContent(ByVal FilePath As String) As StringBuilder
   Dim sbMailContent As New StringBuilder
   ' 設定要查詢的欄位
   Dim aryColumns() As String = {"主機名稱", "工作名稱", "狀態", "上次執行時間"}
   Dim intServerNamePos As Integer = 0
   Dim intStatusPos As Integer = 2
   Dim aryColPos(aryColumns.Length) As Integer
   Dim strLine As String = ""

   sbMailContent.AppendLine("<table>")
   sbMailContent.AppendLine(" <tr>")
   For t As Integer = 0 To aryColumns.Length - 1
      sbMailContent.AppendLine("<th>" & aryColumns(t) & "</th>")
   Next
   sbMailContent.AppendLine(" </tr>")

   Dim srReader As New StreamReader(FilePath, Encoding.Default)
   strLine = srReader.ReadLine()
   If Len(strLine) > 0 Then

      ' 找要查詢欄位的位置
      Dim aryHeader() As String = strLine.Split(""",""")
      For c As Integer = 0 To aryColumns.Length - 1
         For h As Integer = 0 To aryHeader.Length - 1
            If aryColumns(c) = Replace(aryHeader(h), """", "") Then
               aryColPos(c) = h
               h = aryHeader.Length
            End If
         Next
      Next

      strLine = srReader.ReadLine()
      While (Len(strLine) > 0)
         ' 如果抓出來的行資料最後不是雙引號結尾, 表示資料跨行
         ' 就繼續抓出下一行, 直到以雙引號結尾
         While (Right(strLine, 1) <> """")
            strLine = strLine & srReader.ReadLine()
         End While
         Dim aryContent() As String = strLine.Split(""",""")
         Dim strColumnValue As String = ""

         sbMailContent.AppendLine(" <tr>")
         For c As Integer = 0 To aryColumns.Length - 1
            If Len(ServerName) = 0 AndAlso c = intServerNamePos Then
               ServerName = Replace(aryContent(aryColPos(c)), """", "")
            End If
            strColumnValue = Replace(aryContent(aryColPos(c)), """", "")
            sbMailContent.AppendLine("<td>" & strColumnValue & "</td>")
         Next
         sbMailContent.AppendLine(" </tr>")
         strLine = srReader.ReadLine()
      End While

   End If
   sbMailContent.AppendLine("</table>")

   Return sbMailContent
End Function

2011年3月10日 星期四

將 SQL Server 2005 SSIS 封裝設為範本

今天在查怎麼將設計好的 SQL Server 2005 SSIS 封裝設為範本
就順便記錄下來 :

1.將設計好的 SSIS 建置起來
2.將建置的封裝檔 (*.dtsx) copy 到
C:\Program Files\Microsoft Visual Studio 8\Common7\
IDE\PrivateAssemblies\ProjectItems\
DataTransformationProject\DataTransformationItems\

3.在專案新增項目, SQL Server Integration Services 專案項目中就會出現此範本
4.參考 TechNet 的說明, 改變封裝的 Name 與 ID 值

[參考TechNet]

話說我在查 TechNet 的資料時, 一直看錯
以為只要 copy 到
C:\Program Files\Microsoft Visual Studio 8\Common7\
IDE\PrivateAssemblies\ProjectItems\
DataTransformationProject\
就好, 害我試了半天都叫不出範本

SQL Server 2005 備份 Analysis Service DB

SQL Server Analysis Service DB
透過 XMLA 命令就可以做到排程備份
將粗體字的部份替換成實際資料即可

<Backup xmlns="http://schemas.microsoft.com/analysisservices/2003/engine">
   <Object>
      <DatabaseID>[Analysis Service DB Name]</DatabaseID>
   </Object>
   <File>[FilePath].abf</File>
   <AllowOverwrite>true</AllowOverwrite>
</Backup>

[參考小狐狸部落] [參考TechNet]