PowerShellを使用したWindows Serverの管理

  • 12,606 views
Uploaded on

Windows PowerShell 2.0 を使用した …

Windows PowerShell 2.0 を使用した
・Server Core の設定
・Hyper-Vの管理
・Active Directoryの管理
・EventLogの管理

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
12,606
On Slideshare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
134
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Windows PowerShell による Server Core の環境設定と操作 マ゗クロソフト株式会社 エバンジェリスト 安納 順一 Anno Junichi http://blogs.technet.com/junichia/ 1
  • 2. 本日の目的 従来のWindows Script にかわる PowerShell を使用したさまざまな管理手法 PowerShell でしかできないこと 2
  • 3. Agenda PowerShell を使用して以下の作業を行います • OSの基本設定 • Hyper-V 環境の管理 • Active Directory の管理 • EventLog の管理 3
  • 4. OSの基本設定 4
  • 5. OSの基本設定 Windows Server 2008 R2 Server Core では簡易GUIを提供 Sconfig.cmd 5
  • 6. PowerShell の゗ンストールと環境設定 ここからPowerShellコンソール • WinRMサービスを起動 Set-WSManQuickConfig • WinRMサービスを「自動」に設定 • WinRM リスナを作成 • WS-Management(HTTP)のFirewall例外を有効にする 6 • PowerShell セッション構成を有効にする
  • 7. PowerShell Remoting ローカルで実行 リモート CL01 上で実行 7
  • 8. PowerShell Remoting 複数のリモートコンピューターを管理 方法1:コンピュータ名を並べて指定 方法2:コンピュータ名一覧をテキストファイルで用意 c:¥tmp¥hosts.txt 8
  • 9. (参考)Server Core がWGの場合 クラ゗ゕント側の TrustedHosts に Server Core を追加する 9
  • 10. コンピューター名変更とドメ゗ン参加 10
  • 11. ネットワーク設定 11
  • 12. Windows Update と デバ゗スドラ゗バのダウンロード 12
  • 13. 画面の解像度 (例)43882AFB-EB1A-406B-98F8-BDC4D019D84E 13
  • 14. (参考)PowerShellを使わない場合 作業 初期状態 操作方法、コマンド例 パスワード変更 未設定 ログオン時に実施 コンピュータ名の変更 ランダム Netdom renamecomputer %computername% /NewName:Server2008-01 ネットワーク環境設定 DHCP Netsh interface ipv4 show interfaces Netsh interface ipv4 add address name=“ローカルエリゕ 接続” address=“192.168.7.100” mask=“255.255.255.0” gateway=192.168.7.254” Netsh interface ipv4 add dnsserver name=“ローカル エリ ゕ接続” 192.168.7.11 index=1 WSHのエンジン変更 wscript Cscript.exe //h:cscript (エンジンを cscript にする) Windows Update設定 未設定 Scregedit.wsf /AU 4 (自動更新を有効にする) 電源管理系機能の設定 Powercfg.exe 役割と機能の追加 未 Oclist.exe で一覧参照、Ocsetup.exeで゗ンストール ドメ゗ン参加 Netdom join %computername% /domain:<domainName> /userd:<domainName>¥<userName> /passwordd:<password> シャットダウン、再起動、ログオフ Shutdown.exe (再起動時は /r ), logoff.exe 14
  • 15. Server Core の管理゗メージ コマンドプロンプト コマンドプロンプト MMC/Server Manager /PowerShellコンソール /PowerShellコンソール /リモードデスクトップ Server Core Remote PC 15
  • 16. リモートからの管理を有効にする • MMC • リモートデスクトップサービス • Server Manager • Windows PowerShell(実施済み) 16
  • 17. MMCを使用したリモート管理を有効にする sconfig.cmd の中で実行している内容 17
  • 18. リモートデスクトップを有効にする 18
  • 19. (参考)Workgroup構成の場合 Server Core側 クライアント側 19
  • 20. Hyper-Vの管理 20
  • 21. Server Core 上の Hyper-V を管理するには • Hyper-V マネージャーから(リモート) • GUIからHyper-Vを管理 • OSの゗ンストール、OSの操作も可能 • System Center Virtual Machine Manager から(リモート) • 合理化されたGUIからHyper-Vを管理 • OSの゗ンストール、操作も可能 • 専用のPowerShellコマンドレットも用意 • WMIを使用してPowerShell から(リモート,ローカル) • コマンドラ゗ンからHyper-Vを管理 • (通信可能であれば)OSの操作が可能 リモート • OSの゗ンストールが行えない ローカル Server Core 21
  • 22. root¥virtualization 内のクラス一覧 MSVM_VirtualSystemManagementServiceSettingData MSVM_virtualSystemManagementService MSVM_ShutdownComponent MSVM_SwitchLANEndpoint MSVM_SyntheticEthernetPortSettingData MSVM_VirtualSwitchManagementService MSVM_VirtualSystemGlobalSettingData MSVM_VirtualSystemSettingData MSVM_EmulatedEthernetPortSettingData MSVM_Vlanendpoint MSVM_ExternalEthernetPort MSVM_AllocationCapabilities MSVM_HeartbeatComponent MSVM_ComputerSystem MSVM_InternalEthernetPort MSVM_DiskDrive MSVM_KvpExchangeComponent MSVM_SwitchPort MSVM_KvpExchangeDataItem MSVM_VirtualSwitch MSVM_MemorySettingData MSVM_MountedStorageImage MSVM_Processor MSVM_ProcessorSettingData MSVM_ResourceAllocationSettingData MSVM_ResourcePool MSVM_SettingsDefineCapabilities 22
  • 23. MSVMクラス 利用のコツ 23
  • 24. Msvm_VirtualSystemManagementService クラス Hyper-Vの全体的な管理を行うクラス メソッド一覧 AddKvpItems ImportVirtualSystem AddVirtualSystemResources ImportVirtualSystemEx ApplyVirtualSystemSnapshot InstantiateVirtualSystem ApplyVirtualSystemSnapshotEx ModifyKvpItems CheckSystemCompatibilityInfo ModifyServiceSettings CloneVirtualSystem ModifyVirtualSystem CreateVirtualSystemSnapshot ModifyVirtualSystemResources DefineVirtualSystem PlanVirtualSystem DestroyVirtualSystem RemoveKvpItems ExportVirtualSystem RemoveVirtualSystemResources ExportVirtualSystemEx RemoveVirtualSystemSnapshot FormatError RemoveVirtualSystemSnapshotTree GetSummaryInformation RequestStateChange GetSystemCompatibilityInfo StartService GetVirtualSystemImportSettingData StopService GetVirtualSystemThumbnailImage 24
  • 25. (例)スナップショットを取る 25
  • 26. (参考)PowerShell modules for Hyper-V Codeplex で提供されているPowerShellコマンドレット群 2009年11月30日時点で ベータ版 http://pshyperv.codeplex.com/ 26
  • 27. Active Directory を管理する + Eventlog を管理する 27
  • 28. AD DS を管理するための準備 • Active Directoryモジュールの読み込み • Active Directory 関連コマンド一覧の参照 28
  • 29. (参考)Windows PowerShell ADモジュール一覧 Add-ADComputerServiceAccount Add-ADDomainControllerPasswordReplicationPolicy Add-ADFineGrainedPasswordPolicySubject Add-ADGroupMember Add-ADPrincipalGroupMembership Get-ADAccountAuthorizationGroup Get-ADAccountResultantPasswordReplicationPolicy Clear-ADAccountExpiration Get-ADComputer Get-ADComputerServiceAccount Disable-ADAccount Get-ADDefaultDomainPasswordPolicy Disable-ADOptionalFeature Get-ADDomain Get-ADDomainController Enable-ADAccount Get-ADDomainControllerPasswordReplicationPolicy Enable-ADOptionalFeature Get-ADDomainControllerPasswordReplicationPolicyUsage Get-ADFineGrainedPasswordPolicy Get-ADFineGrainedPasswordPolicySubject Get-ADForest Get-ADGroup Get-ADGroupMember Get-ADObject Get-ADOptionalFeature Get-ADOrganizationalUnit Get-ADPrincipalGroupMembership Get-ADRootDSE Get-ADServiceAccount Get-ADUser Get-ADUserResultantPasswordPolicy 29
  • 30. Install-ADServiceAccount Search-ADAccount Move-ADDirectoryServer Set-ADAccountControl Move-ADDirectoryServerOperationMasterRole Set-ADAccountExpiration Move-ADObject Set-ADAccountPassword Set-ADComputer New-ADComputer Set-ADDefaultDomainPasswordPolicy New-ADFineGrainedPasswordPolicy Set-ADDomain New-ADGroup Set-ADDomainMode New-ADObject Set-ADFineGrainedPasswordPolicy New-ADOrganizationalUnit Set-ADForest New-ADServiceAccount Set-ADForestMode New-ADUser Set-ADGroup Set-ADObject Remove-ADComputer Set-ADOrganizationalUnit Remove-ADComputerServiceAccount Set-ADServiceAccount Remove-ADDomainControllerPasswordReplicationPolicy Set-ADUser Remove-ADFineGrainedPasswordPolicy Remove-ADFineGrainedPasswordPolicySubject Uninstall-ADServiceAccount Remove-ADGroup Remove-ADGroupMember Unlock-ADAccount Remove-ADObject Remove-ADOrganizationalUnit Remove-ADPrincipalGroupMembership Remove-ADServiceAccount Remove-ADUser Rename-ADObject Reset-ADServiceAccountPassword Restore-ADObject 30
  • 31. ユーザー情報の参照 • 現在ログオンしているユーザーIDの情報 • ユーザーのプロパテゖを参照 31
  • 32. AD DS をブラウズ PS C:>cd AD: PS AD:>dir Name ObjectClass DistinguishedName ------------------------------------------------------------------------- Contoso domainDNS dc=Contoso,dc=Com Configuration configuration cn=Configuration,dc=contoso,… Schema dMD cn=schema,cn=Configuration,… ・ ・ PS AD:¥>cd ‘.¥DC=Contoso,DC=Com’ PS AD:¥DC=Contoso,DC=Com>dir Name ObjectClass DistinguishedName ------------------------------------------------------------------------- Builtin BuiltinDomain cn=Builtin,dc=contoso,dc=com Computers container cn=Computers,dc=contoso,dc… ・ ・ 32
  • 33. 特定条件のユーザーを検索① • ユーザーIDに test を含むユーザーを検索する • 無効化されたユーザーを検索する • パスワードの有効期限が切れたユーザーを検索する • ゕカウントの有効期限が切れたユーザーを検索する • ロックされたユーザーを検索する • パスワードが無期限のユーザーを検索する 33
  • 34. 特定条件のユーザーを検索② • 1年間ログオンしていないユーザーを検索する ※ただし最近作成したユーザーは除外する この間にログオンしていないユーザー 除外 今から365日前 2009/11/18 17:00:00 34
  • 35. ユーザーを作成 #ドメ゗ンに移動 cd AD: cd ‘.¥DC=contoso,DC=com’ #OUを作成 New-ADOrganizationalUnit “TESTOU” #OUに移動 cd ‘.¥OU=TESTOU’ #ユーザーを作成 New-ADUser –Name “itanaka” -UserPricipalName “itanaka@demodomain.com” -displayName “田中 一郎” 35
  • 36. UserAccountControl フラグ の設定 Set-AccountControl –Identity “<UserID>” -AccountNotDelegated $True | $False ゕカウントは重要なので委任できない -AllowReversiblePasswordEncryption $True | $False 暗号化を元に戻せるパスワードで保存する -AuthType {Negotiate | Basic} 使用する認証方式 -CannotChangePassword <bool> ユーザーはパスワードを変更できない -DoesNotRequirePreAuth <bool> Kerberos事前認証を必要としない -Enabled <bool> ゕカウントの有効/無効 -HomedirRequired <bool> ゕカウントにホーム デゖレクトリが必要であるかどうか -MNSLogonAccount <bool> マジョリテゖ ノード セットログオン ゕカウントであるかどうか -Partition <DN> Active Directory パーテゖションの識別名 -PasswordNeverExpires <bool> パスワードを無期限にする -PasswordNotRequired <bool> ユーザーは次回ログオン時にパスワード変更が必要 -TrustedForDelegation <bool> 任意のサービスへの委任でこのユーザーを信頼する -TrustedToAuthForDelegation <bool> このゕカウントで委任を使用できる -UseDESKeyOnly <bool> このゕカウントにKerberos DES暗号化を使う 36
  • 37. パスワード Set-ADAccountPassword -Identity <ADAccount> -NewPassword <SecureString> -OldPassword <SecureString> Set-ADAccountPassword -Identity <ADAccount> -NewPassword <SecureString> -Reset <switch> 37
  • 38. PowerShellでしかできない削除ユーザーの復活 Active Directory Recycle Bin 機能 削除したユーザーを完全復活! 既定で180日間保持(変更可能) 削除状態からの復旧であればAuthoritative Restoreは不要 属性情報の紛失時には使えない Linked-Value も完全復活 グループメンバーシップやグループメンバー など 留意事項(ご参考) Active Directory フォレスト機能レベル Windows Server 2008 R2 規定では無効(有効にしたら元には戻せない) DITの容量が10~15%程度増加(目安) 操作は Windows PowerShell を使用 38
  • 39. Active Directory Recycle Bin 「削除済」からの完全復旧 削除 Lifetime Lifetime 操作 180 Days 180 Days 有効 削除済 リサ゗クル済 消滅 Garbage Collection ・ ・ ・ ・ ・ ・ 39
  • 40. (参考)ラ゗フタ゗ムを変更するには 削除済オブジェクト の ライフタイム を変更する リサイクル済オブジェクトのライフタイムを変更する 40
  • 41. Recycle Binを使用するための準備 フォレストの機能レベルを「2008 R2」にする 「ゴミ箱」を有効にする 41
  • 42. 削除されたユーザーを復旧する 削除されたユーザーを参照する ユーザーを復旧する 42
  • 43. Active Directory Recycle Bin のメカニズム 削除されるとDeleted Objects コンテナに移動 IsDeleted属性が Trueに 全てのオブジェクトがフラットに並ぶ RDN(識別名)が書き換えられる <現在のRDN>¥0ADEL:<GUID> CN=Deleted Objects OU=Finance CN=Robert¥0ADEL:… CN=Robert CN=Mark¥0ADEL:… CN=Mark CN=Tom¥0ADEL:… CN=Tom CN=Sally¥0ADEL:… OU=Admins OU=Admins¥0ADEL:… CN=Sally OU=Finance¥0ADEL:... 43
  • 44. ツリー構造の復旧はルートから行う 復旧は親から順に行う 親オブジェクトが存在しない場合にエラー 親はlastKnownParent 属性に入っている まずは ここから CN=Deleted Objects OU=Finance CN=Robert¥0ADEL:… CN=Robert CN=Mark¥0ADEL:… CN=Mark CN=Tom¥0ADEL:… CN=Tom CN=Sally¥0ADEL:… OU=Admins OU=Admins¥0ADEL:… CN=Sally OU=Finance¥0ADEL:... 44
  • 45. 組織ツリーの復旧 1. 親を復旧 2. 親が「Finance_Department」であるものを復旧 3. 親が「Admins」であるものを復旧 45
  • 46. ユーザーIDのプロビジョニング - Before 従来のプロビジョニング(WS2003~WS2008) 各種属性 所属グループ メンバーシップ 46
  • 47. ユーザーIDのプロビジョニング - After Windows Server 2008 R2では 各種属性 所属グループ メンバーシップ 47
  • 48. ユーザーIDのプロビジョニング - After+ さらなる内製化 各種属性 所属グループ メンバーシップ 監査ログ 48
  • 49. ユーザー属性の変更を追跡するには① [ADSIエデゖタ] で Everyoneに対して 「すべてのプロパテゖの書き込み」を監査 監査の設定 49
  • 50. ユーザー属性の変更を追跡するには② デゖレクトリサービスのゕクセスの監査 を有効にする 50
  • 51. ゗ベントID 5136 department 属性が 「営業部」から「経理部」に変わったことがわかる 51
  • 52. EventID 5136 を検索する searchEvent.ps1 52
  • 53. 出力結果例 53
  • 54. AD Recycle Bin + PowerShell + 監査ログ 業務に与える゗ンパクト データ復旧時のシステム停止時間を大幅に削減 従来 Authoritative Restore によるバックゕップからの復元 Snapshot から取り出し(Windows Server 2008) 今後 Windows PowerShell によって簡単に復元 局所的に復元が可能 簡易的なユーザーIDプロビジョニングシステムの実現 導入コストの大幅な軽減 中小規模システムへの適用が可能に 54
  • 55. まとめ 55
  • 56. まとめ 難しくて面倒なWMIが身近に コードの量が半分以下に(VBS比) 慣れたコマンドを併用可能 GUIでは知りえない情報も取得 今後、多くのServer製品にコマンドレットが付属 56
  • 57. 57
  • 58. Appndix - WMI による Windows Server の 監視 (VBScript編) 58
  • 59. WMI とは Windows Management Instrumentation WBEM/CIMに準拠 各種管理情報への共通゗ンターフェース Windows Management Serviceとして実装 Windows 2000以上のOSに標準搭載 WMIプロバ゗ダはベンダーが拡張可能 別途エージェントは一切必要なし もちろんタダ! 59
  • 60. 60
  • 61. WMI にゕクセスするには バッチフゔ゗ルから WMICコマンド(Windows XP以降) Windows Script Host から Windows PowerShell から Visual Studio から GUIツールから WMI Admin Tools など 61
  • 62. WMIの構造 %WinDir%¥System32¥wbem 配下の mof (Managed Object Format) フゔ゗ルに定義されている Namespace によって使える Namespace Class が異なることに注意 規定のNamespaceは Class Root¥CIMV2 (例) ROOT¥COMV2 Win32_OperatingSystem Win32_NTLogEventLog ・ ・ ROOT¥Default STDREGPROV ROOT¥microsoft¥SqlServer¥ComputerManagement10 SqlService ・ 62 ・
  • 63. WMIの主役 Win32_クラス 一部抜粋 Win32_ActiveRoute Win32_ModuleTrace Win32_ComputerShutdownEvent Win32_NamedJobObject Win32_ComputerSystemEvent Win32_NTDomain Win32_ConnectionShare Win32_PingStatus Win32_CurrentTime Win32_ProcessStartTrace Win32_DeviceChangeEvent Win32_ProcessStopTrace Win32_DiskQuota Win32_Proxy Win32_GroupInDomain Win32_QuotaSetting Win32_IP4PersistedRouteTable Win32_ServerConnection Win32_IP4RouteTable Win32_SessionConnection Win32_IP4RouteTableEvent Win32_TokenGroups Win32_JobObjectStatus Win32_TokenPrivileges Win32_LoggedOnUser Win32_VolumeChangeEvent Win32_LogonSession Win32_WindowsProductActivation Win32_LogonSessionMappedDisk Win32_ControllerHasHub Win32_NetworkAdapter ・ Win32_ComputerSystem ・ ・ ・ ・ 63
  • 64. WMI Tools ~ CIM Studio ブラウザを使用して、WMIの構造、実際の゗ンスタンスを確認 クエリを発行して戻り値を確認 リモートコンピュータに接続も可能 64
  • 65. VBScriptからWMIを使う 65
  • 66. WMI Scriptingの基本形 'SWbemLocator オブジェクトの作成 Set Locator = CreateObject("WbemScripting.SWbemLocator") ‘ローカルコンピュータへの接続 Set Service = Locator.ConnectServer("", "root¥cimv2", "", "") ‘クエリーの定義(WQL:WMI Query Language) strQuery = "Select * from Win32_NetworkAdapterConfiguration " & _ "where IPEnabled = True" ‘クエリーの実行(インスタンスを取得する) Set objNet = Service.ExecQuery(strQuery) '結果の参照 For each n in objNet WScript.Echo n.caption WScript.Echo n.MACAddress Next 66
  • 67. WMIスクリプトの実行権限 リモートコンピュータに対するゕクセス権の取得 Set Service = Locator.ConnectServer(RemoteHost,Namespace,User,Password) 特殊権限の取得 Set Locator = CreateObject("WbemScripting.SWbemLocator") Set Service = Locator.ConnectServer("DC01", "root¥cimv2", "Dom¥administrator", "pass") Service.Security_.Privileges.AddAsString "SeBackupPrivilege", True Service.Security_.Privileges.AddAsString "SeSecurityPrivilege", True strQuery = "Select * from Win32_NTEventlogFile" & _ " Where LogfileName = 'Security' " Set obj = Service.ExecQuery(strQuery) For each n in obj r = n.BackupEventLog("C:¥tmp¥Security.evt") Next 67
  • 68. (注意)リモートコンピュータにゕクセスする前に① リモートからの接続が許可されていることを確認 規定ではシステム管理者にはゕクセスが許可されている 68
  • 69. (注意)リモートコンピュータにゕクセスする前に② 69
  • 70. Windows Serverを監視する 70
  • 71. ゗ベントの監視 システムで発生した゗ベントをトリガーとして処理を実行 一時監視と永続的監視 以下の゗ベント監視用クラスが用意されている __InstanceCreationEvent あたらしい゗ンスタンスが作成された __InstanceModificationEvent ゗ンスタンスの属性が変更された __InstanceDeletionEvent 既存の゗ンスタンスが削除された 71
  • 72. 監視の゗メージ ゗ベントログに゗ベ WORDが起動 ントが書かれた USBデバ゗スが挿された タ゗ムゾーンが変更 ユーザーがログオン IPゕドレス変更 シャットダウン メモ帳が終了 72
  • 73. 一時的な監視例① __InstanceCreationEventによる新たに作成されたインスタンスの監視 Set objLocator = CreateObject("WbemScripting.SWbemLocator") Set objService = objLocator.ConnectServer(TargetComputer, _ "", AdminUser, AdminPass) strQueryCreate = "Select * " & _ "FROM __InstanceCreationEvent WITHIN 5 " & _ 監視したい "WHERE TargetInstance ISA 'Win32_Process' " クラス Set objEventsCreation = objService.ExecNotificationQuery(strQueryCreate) Do Set CreationEvent = objEventsCreation.Nextevent ProcessName = CreationEvent.TargetInstance.Name Win32_Procass Wscript.Echo ProcessName のプロパテゖ Loop 73
  • 74. 一時的な監視例② __InstanceModificationEventによるユーザーログオンの監視 Set objLocator = CreateObject("WbemScripting.SWbemLocator") Set objService = objLocator.ConnectServer(TargetComputer, _ ‚ROOT¥CIMV2", AdminUser, AdminPass) strQuery= "Select * " & _ "FROM __InstanceModificationEvent WITHIN 5 " & _ "WHERE TargetInstance ISA 'Win32_ComputerSystem' " Set objEventsModification = objService.ExecNotificationQuery(strQuery) Do Set ModificationEvent = objEventsModification.Nextevent UserName = ModificationEvent.TargetInstance.UserName Wscript.Echo UserName Loop 74
  • 75. そこでこんな方法… 現在のログオンセッション一覧をキャッシュ ログオンしたらセッション作成 ログオフしたらセッション削除 ログオン時に割り振られた番号 ログオンのタ゗プ(対話、ネットワーク…) 現在ログオンしているユーザーのユーザーIDとログ オンIDをキャッシュ ログオンしたユーザーID ログオン時に割り振られた番号 75
  • 76. 一時的な監視例③ __InstanceCreationEventによるユーザーログオンの監視 Set objLocator = CreateObject("WbemScripting.SWbemLocator") Set objService = objLocator.ConnectServer("demo2008", "ROOT¥CIMV2", "", "") Wscript.Echo "接続が完了しました" strQueryCreate = "Select * FROM __InstanceCreationEvent WITHIN 5 " & _ "WHERE TargetInstance ISA 'Win32_LogonSession' ‚ Set objEventsCreation = objService.ExecNotificationQuery(strQueryCreate) Do Set CreationEvent = objEventsCreation.Nextevent LogonId= CreationEvent.TargetInstance.LogonID LogonType = CreationEvent.TargetInstance.LogonType strQueryLU = "Select * " & _ ‚FROM Win32_LoggedOnUser‛ ' Where Dependent like ‘%" & LogonId & "%’‚ Set objLoggedOnUser = objService.ExecQuery(strQueryLU) For Each u in objLoggedOnUser If instr(u.Dependent, LogonId) Then Wscript.Echo u.Antecedent ユーザーID Wscript.Echo u.Dependent ログオンID End If Next Loop 76
  • 77. 一時的な監視例③‘ (③をブラッシュアップ) Set objLocator = CreateObject("WbemScripting.SWbemLocator") Set objService = objLocator.ConnectServer("demo2008", "ROOT¥CIMV2", "", "") Wscript.Echo "接続が完了しました" strQueryCreate = "Select * FROM __InstanceCreationEvent WITHIN 5 " & _ "WHERE TargetInstance ISA 'Win32_LogonSession' ‚ Set objEventsCreation = objService.ExecNotificationQuery(strQueryCreate) Do Set CreationEvent = objEventsCreation.Nextevent LogonId= CreationEvent.TargetInstance.LogonID LogonType = CreationEvent.TargetInstance.LogonType Select Case LogonType Case 0 strLogonType = "System" Case 2 strLogonType = "Interactive" Case 3 strLogonType = "Network" Case 4 strLogonType = "Batch" Case 5 strLogonType = "Service" Case 6 strLogonType = "Proxy" Case 7 strLogonType = "Unlock" Case 8 strLogonType = "NetworkClearText" Case 9 strLogonType = "NewCredentials" Case 10 strLogonType = "RemoteInteractive(TS)" Case 11 strLogonType = "CachedInteractive" Case 12 strLogonType = "CachedRemoteInteractive" Case 13 strLogonType = "CachedUnlock" End Select 77
  • 78. strQueryLoggedOnUser = "Select * " & _ "FROM Win32_LoggedOnUser" Set objLoggedOnUser = objService.ExecQuery(strQueryLoggedOnUser) For Each u in objLoggedOnUser If instr(u.Dependent, LogonId) Then arrAntecedent = Split(u.Antecedent,".") Wscript.Echo Date & "," & Time & "," & _ LogonId & "," & arrAntecedent(2) & "," & strLogonType Exit For End If Next Loop 78
  • 79. 一時的な監視例④ __InstanceDeletionEventによるユーザーログオフの監視 Set objLocator = CreateObject("WbemScripting.SWbemLocator") Set objService = objLocator.ConnectServer("demo2008", "ROOT¥CIMV2", "", "") Wscript.Echo "接続が完了しました" strQueryCreate = "Select * " & _ "FROM __InstanceDeletionEvent WITHIN 5 " & _ "WHERE TargetInstance ISA 'Win32_LogonSession' " Set objEventsDeletion = objService.ExecNotificationQuery(strQueryCreate) Do Set DeletionEvent = objEventsDeletion.Nextevent LogonId= DeletionEvent.TargetInstance.LogonID LogonType = DeletionEvent.TargetInstance.LogonType Wscript.Echo Date & "," & Time & "," & LogonId & "," & strLogonType Loop セッションの削除はログオフしてから1分程度を要する 79
  • 80. ③’と④を組み合わせると ログオンID をキーにしてログデータベースに書き込むことでサーバー を使用したユーザーの履歴を管理できる ログDB ServerName LogonID LogonType LogonDateTime LogoffDateTime Domain UserID demo2008 5443965 Interactive 2009/03/01 2009/03/01 dom anno 10:00:00 12:15:30 demo2008 6220879 TS 2009/03/01 2009/03/01 dom administrator 12:00:00 13:10:01 80
  • 81. スクリプトをサービス化 81
  • 82. ゗ベントコンシューマ イベントコンシューマとは…. システムで発生したイベントをトリガーに特定のアクションを 実行する機構 • ActiveScriptEventConsumer – イベントが発生したらスクリプトを実行 • LogFileEventConsumer – ゗ベントが発生したらテキストフゔ゗ルに書き込み • NTEventLogEventConsumer – ゗ベントが発生したら゗ベント • SMTPEventConsumer – ゗ベントが発生したらメール送信 • CommandLineEventConsumer – ゗ベントが発生したらコマンドを実行 システムに登録されるのでログオンする必要が無い ただし、監視できるのはローカルコンピュータ 82
  • 83. MOFフゔ゗ルによる永続的監視 ActiveScriptEventConsumerによるmofフゔ゗ルの例 #pragma namespace("¥¥¥¥.¥¥root¥¥subscription") instance of ActiveScriptEventConsumer as $Cons { Name = "LogonUserLogging"; ScriptingEngine = "VBScript"; ScriptFileName = "c:¥¥tmp¥¥demoscript¥¥wmisample08.vbs"; }; instance of __EventFilter as $Filt { Name = "LogonUser"; Query = "SELECT * FROM __InstanceCreationEvent WITHIN 5 " "WHERE TargetInstance ISA ¥"Win32_LogonSession¥" "; QueryLanguage = "WQL"; EventNamespace = "root¥¥cimv2"; }; instance of __FilterToConsumerBinding { Filter = $Filt; Consumer = $Cons; 83 };
  • 84. 拡張子 mof で保存 コマンドプロンプトからコンパ゗ル C:¥>mofcomp.exe <mofフゔ゗ル名> 84
  • 85. 呼び出されるスクリプト(③‘’) Set objLocator = CreateObject("WbemScripting.SWbemLocator") Set objService = objLocator.ConnectServer("demo2008", "ROOT¥CIMV2", "", "") Set objFS = CreateObject("Scripting.FileSystemObject") Wscript.Echo "接続が完了しました" strQueryCreate = "Select * FROM __InstanceCreationEvent WITHIN 5 " & _ "WHERE TargetInstance ISA 'Win32_LogonSession' ‚ Set objEventsCreation = objService.ExecNotificationQuery(strQueryCreate) Do Set CreationEvent = objEventsCreation.Nextevent LogonId= CreationEventTargetEvvent.TargetInstance.LogonID LogonType = CreationEventTargetEvent.TargetInstance.LogonType Select Case LogonType Case 0 strLogonType = "System" Case 2 strLogonType = "Interactive" Case 3 strLogonType = "Network" Case 4 strLogonType = "Batch" Case 5 strLogonType = "Service" Case 6 strLogonType = "Proxy" Case 7 strLogonType = "Unlock" Case 8 strLogonType = "NetworkClearText" Case 9 strLogonType = "NewCredentials" Case 10 strLogonType = "RemoteInteractive(TS)" Case 11 strLogonType = "CachedInteractive" Case 12 strLogonType = "CachedRemoteInteractive" Case 13 strLogonType = "CachedUnlock" End Select 85
  • 86. strQueryLoggedOnUser = "Select * FROM Win32_LoggedOnUser" Set objLoggedOnUser = objService.ExecQuery(strQueryLoggedOnUser) For Each u in objLoggedOnUser If instr(u.Dependent, LogonId) Then arrAntecedent = Split(u.Antecedent,".") Set objLogFile = objFS.OpenTextFile("C:¥tmp¥demoscript¥userlog.txt",8,True) objLogFile.WriteLine Date & "," & Time & "," & LogonId & "," & _ arrAntecedent(2) & "," & strLogonType objLogFile.Close Wscript.Echo Date & "," & Time & "," & _ LogonId & "," & arrAntecedent(2) & "," & strLogonType Exit For End If Next Loop 86
  • 87. リソース MSDN - Windows Management Instrumentation http://msdn.microsoft.com/en-us/library/aa394582(VS.85).aspx Script Guy! http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/ default.mspx 87
  • 88. 88