2011年3月15日火曜日

◆ActiveDirectoryユーザーを追加する(New-ADUser)

GUIでユーザーを追加するときは仮の初期パスワードを付けていたのだが(そうしないと怒られるので)以下のようにすると初期パスワード無しでも行けるようだ。
(GUIでも出来るのかもしれないが)

001
002
003
004
005
006
007
008
009
010

$param = @{
  Name 
= "haratatsu"
  Surname = "原"
  GivenName = "辰徳"
  Enabled = $true
  PasswordNotRequired = $true
  Path = "OU=MyOU,DC=hoge,DC=co,DC=jp"
}

New-ADUser @param

◆ActiveDirectoryパラメータ

PowerShell from Japan!! Blog « PowerShell 情報発信ブログにActiveDirectoryのパラメータを解説した便利な画像があったのでリンクしておく。

◆ボリュームラベルを設定する

こんな感じで良いのかな・・・。

$drive = gwmi win32_volume | ?{$_.driveletter -eq "E:"}
$drive.label = "Tempドライブ"
$drive.put()

2011年3月14日月曜日

◆ActiveDirectoryユーザーを表示(検索する) (Get-ADUser)

-filterパラメータに*を指定すると全ユーザーを表示してくれるようだ。

PS>Get-ADUser -Filter * | ft name,enabled -auto

name          enabled
----          -------
Administrator    True
Guest           False
minminnana       True
krbtgt          False
テスト 太郎      True


ダイレクトに表示するには、

PS>Get-ADUser  -identity "administrator" | ft name,enabled -auto

name          enabled
----          -------
Administrator    True


PS>Get-ADUser  "administrator" | ft name,enabled -auto

name          enabled
----          -------
Administrator    True

条件を指定するには、

PS>Get-ADUser -Filter {name -like "mi*"}


DistinguishedName : CN=minminnana,CN=Users,DC=mtg,DC=xxx,DC=co,DC=jp
Enabled           : True
GivenName         :
Name              : minminnana
ObjectClass       : user
ObjectGUID        : a2678468-1d8c-4dcb-9bba-0437f9efc448
SamAccountName    : minminnana
SID               : S-1-5-21-806116398-1360096813-3268469348-1000
Surname           :
UserPrincipalName :

色々なプロパティを参照するには、単純にgmすると

PS>Get-ADUser administrator | gm


   TypeName: Microsoft.ActiveDirectory.Management.ADUser

Name              MemberType            Definition
----              ----------            ----------
Contains          Method                bool Contains(string propertyName)
Equals            Method                bool Equals(System.Object obj)
GetEnumerator     Method                System.Collections.IDictionaryEnumerator GetEnumerator()
GetHashCode       Method                int GetHashCode()
GetType           Method                type GetType()
ToString          Method                string ToString()
Item              ParameterizedProperty Microsoft.ActiveDirectory.Management.ADPropertyValueCollection It
DistinguishedName Property              System.String DistinguishedName {get;set;}
Enabled           Property              System.Boolean Enabled {get;set;}
GivenName         Property              System.String GivenName {get;set;}
Name              Property              System.String Name {get;}
ObjectClass       Property              System.String ObjectClass {get;set;}
ObjectGUID        Property              System.Nullable`1[[System.Guid, mscorlib, Version=2.0.0.0, Cultur
SamAccountName    Property              System.String SamAccountName {get;set;}
SID               Property              System.Security.Principal.SecurityIdentifier SID {get;set;}
Surname           Property              System.String Surname {get;set;}
UserPrincipalName Property              System.String UserPrincipalName {get;set;}

こんなメンバーしか帰って来ないので、

PS>Get-ADUser administrator -Properties *

とやると全てのメンバーが表示できそうだ。

Mailアドレスに指定のあるユーザーを全て表示する。

PS>Get-ADUser -Filter {mail -like "*"} | select name,mail

name                                                        mail
----                                                        ----
minminnana
Administrator


とやりたくなるが、mailは標準では表示されないプロパティなので、

PS>Get-ADUser -Filter {mail -like "*"} -property mail | select name,mail

name                                                        mail
----                                                        ----
minminnana                                                  minminnana@hoge.co.jp
Administrator                                               testmail@hoge.co.jp

といった感じになる。

まぁ、ヘルプを見れば普通の事は出来るのではなかろうか。

2011年3月11日金曜日

◆イベントログを取得(抽出)する(Get-WinEvent)

イベントログを取得するにはGet-WinEventコマンドレットを使えば良い。
取ってきたログを抽出するのも普通にやれば問題ないのだが、全部取ってきてからでは時間が掛かる。

そんな時は、ログを取ってくる時点でFilterして上げれば良い。FilterHashtableオプションを使うのが簡単そうだ。

サンプルとして過去数カ月の発生頻度の高いエラーや警告をサマリーして抽出するスクリプトを作ってみた。

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020

$levels = @{重大 = 1 ; エラー =2 ; 警告 = 3}
$lognames = "system","application"
$month = 10  #過去何ヶ月を表示するか

function getevent($logname,[ref]$reflevel
){
 
$level = $reflevel.
value
 
Write-Host <$logname $level.name -ForegroundColor Cyan
  Get-WinEvent -ErrorAction SilentlyContinue -FilterHashtable
 @{
    level 
= $level.
value
    logname 
= $logname
    starttime = ((get-date).addmonths(-$month
))
  } 
|
 
 
group id | sort count -des | select -first 5 |
 
 
select count,name,{$_.group[0].message} | ft -auto -Wrap
}

$lognames | %
{
 
$logname = $_
  $levels.GetEnumerator() | sort value | %{getevent $logname ([ref]$_) }
}

結果はこんな感じになる。
20110311105207

指定できる抽出条件は以下のような感じ。

20110311105655

また、Get-WinEventコマンドレットはコンピューター名も指定できるようなので、ドメイン管理者とかであれば、複数サーバーを巡回させてSystemCenter的な使い方もできそうだ。

---- 2015/3/3 --

Ver3以上であればHashTableからPSCustomObjectに変換して以下の様な感じでもOK
(本質的な部分ではないのでどうでもよいのだが、[ref」でやるのはちょっとイマイチな感じもあるので、個人的にメモしておく)
--

あっれー、違うっぽい?「PsCustomObject」は不要で、単に配列にしたからEnumerate不要になっただけ?

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021

$levels = [PsCustomObject]@{name="重大";value=1},
          [PsCustomObject]@{name="エラー";value=2},
          [PsCustomObject]@{name="警告";value=3}
$lognames = "system","application"
$month = 10  #過去何ヶ月を表示するか

function getevent($logname,$level
){
 
Write-Host <$logname $level.name -ForegroundColor Cyan
  Get-WinEvent -ErrorAction SilentlyContinue -FilterHashtable
 @{
    level 
= $level.
value
    logname 
= $logname
    starttime = ((get-date).addmonths(-$month
))
  } 
|
 
 
group id | sort count -des | select -first 5 |
 
 
select count,name,{$_.group[0].message} | ft -auto -Wrap
}

$lognames | %
{
 
$logname = $_
  $levels | sort value | %{getevent $logname ($_) }
}

2011年3月7日月曜日

◆ローカルユーザーグループのメンバー一覧を表示する

ローカルユーザーグループを取得し、それぞれのグループのメンバーを一覧表示する。

001
002
003
004
005
006
007
008
009
010

$strComputer = hostname
Get-WMIObject
 Win32_Group -filter "domain='$strComputer'" | %
{
 
$computer = [ADSI]("WinNT://" + $strComputer + ",computer"
) 
 
$Group = $computer.psbase.children.find($_.
name) 
 
$members= $Group.psbase.invoke("Members") | %
{
   
$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null
)
  } 
 
Write-Host "<" $_.name "Group >" -ForegroundColor Yellow
  $members
}

結果
image

2011年3月1日火曜日

◆終了コードを取得する

終了コードについては自動変数である$lastexitcodeを参照すれば良い。

20110301100533

PS>D:\Desktop\test.ps1
PS>$lastexitcode
30
PS>D:\Desktop\test.bat
PS>$lastexitcode
20