Windows PowerShell自動化使用者提供,第 1 部

Don Jones

內容

設定目標
建立初始結構
取得輸入
擴充
[下一步] 上傳

這個資料行,我正在進行關閉一個四篇系列如果要在 Windows PowerShell 中,建立實用、 真實世界、 使用者提供的指令碼。在這第一個的部分我將著重建立指令碼結構。下個月,我將探討實際在 Active Directory 及 Exchange Server 2007 中建立新的、 擁有信箱功能的使用者。該下列的月我將會需要處理建立主目錄,並套用適當的存取控制清單 (ACL),這些。和,最後的單元,我將群組中放入新的使用者,並負責填入其他 Active Directory 屬性。

視訊

Don Jones 會啟動關閉一四個部分系列,查看如何使用 Windows PowerShell 建立使用者提供的指令碼中。監看 Don 示範此視訊的這些技巧。

設定目標

使用者提供最棘手的部分,從初始的資料將會是哪裡來決定。我將如何知道哪些使用者建立?以及,將我取得其資訊,例如名稱、 電子郵件位址、 郵寄地址、 部門和其他詳細資料嗎?

幾乎每個環境會有一個不同的答案,並因此我將在這裡建立指令碼,是可以接受輸入的各種不同的位置。將指令碼稍微複雜,但它將是值得努力的長期因為指令碼將會更具彈性。我們也要建置指令碼能夠為一,輕鬆建立百新使用者 — 這都是有關自動化,!

建立初始結構

我做合理數量諮詢與不同的公司,而大量的焦點是指令碼和自動化。不令人驚訝的是,我在看到許多的指令碼,而且我已經注意到一般的方法是讓系統管理員只建立單一佈建的指令碼。

隨著時間,系統管理員將修改指令碼以處理多項工作。無法以錯誤的方法不過藉由使用時間最多前建立一個有點多個模組化結構,您可以建立指令碼,實際上更具彈性且更容易維護。而且這不需要多額外的工作。

我將名為提供中央函式的開頭。它不實際的要做很大) ; 使用 Hashtable (或關聯陣列),它會接受,會包含在新使用者] 資訊中,並將然後它會呼叫一系列的 Sub-functions,實際上處理的所有提供的工作。因為這是 Windows PowerShell,我想要所有此管線的工作。因此我要讓它接受每個新的使用者的一個 Hashtable,並我也將會讓它可以接受整個管線完整的雜湊表,建立多個使用者]。

基本的函式樣板,如下所示:

Function Provision {
  PROCESS {
  }
}

不是很驚人是它? 有了 Windows PowerShell,它不需要。 PROCESS 指令碼區塊會一次執行每個物件我會傳送到函式。 並,PROCESS 指令碼區塊,內,我會使用 $ _ 變數來存取目前的管線物件。

Windows PowerShell Q & A

問: 我查閱 MSDN 網站上的 Win32_OperatingSystem Windows Management Instrumentation (WMI) 類別。 它會表示類別包含 Service Pack 的版本資訊。 當我在 Windows PowerShell 中執行 Get-WmiObject 的 Win32_OperatingSystem 時,會顯示沒有 Service Pack 的資訊。 為什麼?

A : Windows PowerShell 格式子系統選取以顯示該類別中的屬性的預設值子集。 一個的方式,強制它顯示的所有屬性會為使用格式化的 Cmdlet,覆寫這些預設值:

Get-WmiObject Win32_OperatingSystem | Format-List *

或如果您只想要特定的屬性:

Get-WmiObject Win32_OperatingSystem | 
Format-List BuildNumber,CSName,ServicePackMajorVersion

取得輸入

我沒有提供函式實際上取得任何資料,它自己的原因是輸入的,我想要更多的彈性的而我不想要返回並變更函式,每次我要採用新的表單。 而,我會建立兩個函式取得我的新使用者資訊 — 從 CSV 檔案和資料庫中的其他。 現在,我將只使用 CSV-相關函式因為 CSV 檔案是容易建立和 [記事本] 或其他文字編輯器 (或甚至 Microsoft Excel 和大部分的資料庫應用程式)。

CSVs 有關的一墩 — 尤其是,如果提供較技術 inclined 有人 — 是您無法依賴的適當的 Active Directory 屬性的檔案的資料行行首。 也就是說,而非資料行的名稱例如 sn 和 samAccountName,您更可能取得資料行的名稱,例如姓氏名字] 和 [登入名稱。 [確定],Windows PowerShell 可以執行轉譯。 我將開始假設 CSV 檔案包含下列資料行:

  • 第一個名稱
  • 姓氏名字
  • 城市
  • 部門
  • 工作職稱
  • 登入名稱
  • 密碼

您也可以的不用說展開 [該清單 — 我會告訴您如何中。 使用此清單,範例 CSV 檔案可能如下:

First Name,Last Name,City,Department,Job  Title,Logon Name,Password
Don,Jones,Las Vegas,IT,Writer,donj,P@ssw0rd
Greg,Shields,Denver,IT,Administrator,gregs,  P@ssw0rd

我會建立名為 ProvisionInputCSV 函式,讓它可以接受檔案名稱做為輸入參數,並讓它只會讀取 CSV 檔案:

Function ProvisionInputCSV {
  Param ([string]$filename)
  Import-CSV $filename
}

我可以單獨,執行該函式類似,所以,只以確定它讀取 CSV 檔案:

ProvisionInputCSV c:\files\myinput.csv

現在我要將轉譯成 Hashtable 的每一行,CSV,函式。 而且,而不是保留從 CSV 檔案的資料行標頭名稱,我希望將轉譯成多 Active Directory 的可接受屬性的名稱的這些資料行標頭。 有許多方法,若要這麼做在 Windows PowerShell 中,,但我將搖桿的相當簡單的方法: 我會使用 foreach 迴圈,來處理 CSV 檔案,一次一個的每一行。 檔案的每一行,我將建立的 Hashtable,並將它寫出至管線。

請看一下我函式 [圖 1 ] 所示。 有值得注意的幾點:

  • foreach,區塊內 $ 使用者變數會包含單一使用者。 foreach 建構會透過 $ 的使用者變數中的每個列中執行,並自動填入 $ 下一個使用者。
  • 因為某些資料行標頭名稱包含空格的需要我會將這些名稱置於引號。
  • 我加入另一個屬性,是從 CSV 資料行的兩個建構的 displayName: 名字和姓氏。
  • 寫入輸出用來寫入每個 Hashtable 管線。

[圖 1 使用 foreach 迴圈的函式

Function ProvisionInputCSV {
  Param ([string]$filename)
  $users = Import-CSV $filename
  foreach ($user in $users) {
    $ht = @{'givenName'=$user."First Name";
            'sn'= $user."Last Name";
            'title'= $user."Job Title";
            'department'= $user.Department;
            'displayName'= $user."First Name" + " " + $user."Last Name";
            'city'= $user.City;
            'password'= $user.Password;
            'samAccountName'= $user."Logon Name"
           }
    Write-Output $ht
  }
}                                                  
 

實際的結論,所有的這是我就可以使用一個函式讀取 CSV 檔案,和將資料轉換為雜湊表。 在雜湊表可以再會輸送到我佈建的函式中:

ProvisionInputCSV c:\data\myinput.csv | Provision

因為我提供的函式接受的標準化的 Hashtable,我可以建立數個不同的輸入-產生函式 — ProvisionInputDatabase,Pro­visionInputSpreadsheet,等等。

只要這些函式會輸出我完整的使用者資料的標準化的 Hashtable,主要提供函式將會正常運作。 這個方法會表示我在未來可以使用全新的輸入的來源,新的使用者資料 — 而不需要修改核心佈建函式。

擴充

您就可以輕鬆地加入更多的資料行您的 CSV 檔案,以填入等電話號碼或其他版本的其他資料要。 您只需要確定您也展開 Hashtable,以包含該資訊。 例如,假設我要新增至我的 CSV 檔案的描述和 Office。 我只是想展開,Hashtable,藉由加入某些行,如 [圖 2 ] 所示。 也就是說,您可以使用基本的結構,我已經提供以符合您的環境有新的使用者帳戶的 [目錄] 屬性的任何需求。

[圖 2 修改函式

Function ProvisionInputCSV {
  Param ([string]$filename)
  $users = Import-CSV $filename
  foreach ($user in $users) {
    $ht = @{'givenName'=$user."First Name";
            'sn'= $user."Last Name";
            'title'= $user."Job Title";
            'department'= $user.Department;
            'displayName'= $user."First Name" + " " + $user."Last Name";
            'city'= $user.City;
            'password'= $user.Password;
            'samAccountName'= $user."Logon Name";
            'office' = $user.office;
            'description' = $user.description
           }
    Write-Output $ht
  }
}

[下一步] 上傳

下個月,我將開始藉由建立一個會建立新的使用者帳戶的 sub-function 填入主要提供函式。 我會提供您兩個版本的 Sub-函式,一個用於人擁有 Exchange Server 2007 (這是啟用的 Windows PowerShell),另一個使用者沒有人。 在該點您實際上會有個相當的可用的指令碼: It 就會建立使用者帳戶。 但因為的其中一個與新的使用者的處理更耗費時間部分,這個函式無法會協助您啟動儲存立即的時間。

Don Jones 是 Pluralsight 的創始人之一,該公司 集中的技術其中每週有關 Windows PowerShell,SQL Server,App-V 他的部落格及其他主題。 請聯絡他透過他的網站。