windows-server について
本番ワークロードの設定と自動化を行う管理者向けの Windows Server 管理スキルです。IIS、Active Directory、PowerShell、イベントログ、更新管理を扱います。
主な機能
- 01PowerShell によるサーバー管理
- 02IIS サイトとアプリケーションプールの設定
- 03Active Directory のユーザーとグループの管理
- 04Windows イベントログの確認
- 05Windows 更新とスケジュールタスクの管理
活用シーン
- 01Windows Server 2019/2022 の設定
- 02IIS サイトとアプリケーションプールの配備
- 03ドメインサービス、ユーザー、グループポリシーの管理
- 04イベントログや更新の問題調査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ bagelhole/ devops-security-agent-skills --skill windows-serverインストール後、Claude Code で/windows-serverを入力して読み込まれたか確認します。
詳細
Windows Server の管理
IIS Web ホスティング、Active Directory ドメインサービス、システムメンテナンスなど、本番ワークロード向けの Windows Server 管理と PowerShell 自動化です。
使用する場面
- Windows Server 2019/2022 インスタンスのプロビジョニングや構成
- IIS Web サイト、アプリケーションプール、バインドの設定
- Active Directory のユーザー、グループ、グループポリシーの管理
- PowerShell による管理タスクの自動化
- トラブルシューティングのための Windows イベントログの確認
- サーバーへの Windows 更新プログラムの適用と管理
前提条件
- 対象サーバーの管理者アカウント
- PowerShell 5.1+(組み込み)または PowerShell 7+ のインストール
- リモートデスクトップまたは WinRM アクセスの構成
- Windows Server 2019 または 2022(デスクトップ エクスペリエンスまたは Server Core)
PowerShell 管理の基本
# Check PowerShell version
$PSVersionTable.PSVersion
# Get system information
Get-ComputerInfo | Select-Object CsName, OsName, OsVersion, OsArchitecture
# List running processes sorted by CPU
Get-Process | Sort-Object CPU -Descending | Select-Object -First 20
# List all services and their status
Get-Service | Where-Object { $_.Status -eq 'Running' }
# Restart a service
Restart-Service -Name W3SVC -Force
# Get disk space on all drives
Get-PSDrive -PSProvider FileSystem | Select-Object Name, @{N='Used(GB)';E={[math]::Round($_.Used/1GB,2)}}, @{N='Free(GB)';E={[math]::Round($_.Free/1GB,2)}}
# Check uptime
(Get-Date) - (Get-CimInstance Win32_OperatingSystem).LastBootUpTime
# Open firewall port
New-NetFirewallRule -DisplayName "Allow HTTPS" -Direction Inbound -Protocol TCP -LocalPort 443 -Action Allow
# List firewall rules
Get-NetFirewallRule | Where-Object { $_.Enabled -eq 'True' -and $_.Direction -eq 'Inbound' } | Select-Object DisplayName, Action
# Set DNS client server addresses
Set-DnsClientServerAddress -InterfaceAlias "Ethernet" -ServerAddresses ("10.0.0.2","10.0.0.3")
# PowerShell remoting to another server
Enter-PSSession -ComputerName server02 -Credential (Get-Credential)
# Run a command on multiple remote servers
Invoke-Command -ComputerName server01,server02,server03 -ScriptBlock { Get-Service W3SVC }
サーバーの役割と機能
# List all available roles and features
Get-WindowsFeature
# Install IIS with management tools
Install-WindowsFeature -Name Web-Server -IncludeManagementTools -IncludeAllSubFeature
# Install Active Directory Domain Services
Install-WindowsFeature -Name AD-Domain-Services -IncludeManagementTools
# Install DNS Server
Install-WindowsFeature -Name DNS -IncludeManagementTools
# Install DHCP Server
Install-WindowsFeature -Name DHCP -IncludeManagementTools
# Install File Server with deduplication
Install-WindowsFeature -Name FS-FileServer, FS-Data-Deduplication
# List installed features only
Get-WindowsFeature | Where-Object Installed | Select-Object Name, InstallState
# Remove a feature
Uninstall-WindowsFeature -Name Telnet-Client
IIS Web サーバーのセットアップ
# Import the IIS administration module
Import-Module WebAdministration
# Create a new application pool
New-WebAppPool -Name "ProductionPool"
Set-ItemProperty IIS:\AppPools\ProductionPool -Name processModel.identityType -Value 3 # NetworkService
Set-ItemProperty IIS:\AppPools\ProductionPool -Name managedRuntimeVersion -Value "" # No managed code (reverse proxy)
# Create a new website
New-Website -Name "MyApp" `
-Port 443 `
-Protocol https `
-PhysicalPath "C:\inetpub\myapp" `
-ApplicationPool "ProductionPool" `
-SslFlags 1
# Add an HTTP binding that redirects to HTTPS
New-WebBinding -Name "MyApp" -Protocol http -Port 80
# Bind an SSL certificate to the HTTPS site
$cert = Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object { $_.Subject -like "*example.com*" }
New-Item IIS:\SslBindings\0.0.0.0!443 -Value $cert
# Create a virtual directory
New-WebVirtualDirectory -Site "MyApp" -Name "static" -PhysicalPath "C:\inetpub\static"
# Start, stop, and restart a site
Start-Website -Name "MyApp"
Stop-Website -Name "MyApp"
Restart-WebAppPool -Name "ProductionPool"
# List all websites and their state
Get-Website | Select-Object Name, State, PhysicalPath, @{N='Bindings';E={$_.Bindings.Collection.bindingInformation}}
# Enable IIS logging with W3C format
Set-WebConfigurationProperty -PSPath "IIS:\Sites\MyApp" `
-Filter "system.webServer/httpLogging" `
-Name "dontLog" -Value $false
# URL Rewrite: redirect HTTP to HTTPS (requires URL Rewrite module)
# web.config rule:
@'
<rule name="HTTP to HTTPS" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="off" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
</rule>
'@
Active Directory の基本
# Promote server to a new domain controller in a new forest
Install-ADDSForest `
-DomainName "corp.example.com" `
-DomainNetBIOSName "CORP" `
-InstallDns:$true `
-SafeModeAdministratorPassword (ConvertTo-SecureString "P@ssw0rd!" -AsPlainText -Force) `
-Force:$true
# Create an Organizational Unit
New-ADOrganizationalUnit -Name "Engineering" -Path "DC=corp,DC=example,DC=com"
# Create a new AD user
New-ADUser -Name "Jane Smith" `
-SamAccountName "jsmith" `
-UserPrincipalName "[email protected]" `
-Path "OU=Engineering,DC=corp,DC=example,DC=com" `
-AccountPassword (ConvertTo-SecureString "TempP@ss1" -AsPlainText -Force) `
-Enabled $true `
-ChangePasswordAtLogon $true
# Add user to a group
Add-ADGroupMember -Identity "Domain Admins" -Members "jsmith"
# Search for users in an OU
Get-ADUser -Filter * -SearchBase "OU=Engineering,DC=corp,DC=example,DC=com" | Select-Object Name, SamAccountName, Enabled
# Disable a user account
Disable-ADAccount -Identity "jsmith"
# Unlock a locked-out account
Unlock-ADAccount -Identity "jsmith"
# Reset a user password
Set-ADAccountPassword -Identity "jsmith" -Reset -NewPassword (ConvertTo-SecureString "NewP@ss1" -AsPlainText -Force)
# List all domain controllers
Get-ADDomainController -Filter * | Select-Object Name, IPv4Address, Site
# Check AD replication status
Get-ADReplicationPartnerMetadata -Target "dc01.corp.example.com"
repadmin /replsummary
Windows 更新プログラムの管理
# Install the PSWindowsUpdate module (from PowerShell Gallery)
Install-Module -Name PSWindowsUpdate -Force
# Check for available updates
Get-WindowsUpdate
# Install all available updates (auto-reboot if needed)
Install-WindowsUpdate -AcceptAll -AutoReboot
# Install only critical and security updates
Install-WindowsUpdate -Category "Security Updates","Critical Updates" -AcceptAll
# View update history
Get-WUHistory | Select-Object -First 20 Title, Date, Result
# Schedule monthly patching via Task Scheduler
$action = New-ScheduledTaskAction -Execute "powershell.exe" `
-Argument "-NoProfile -Command Install-WindowsUpdate -AcceptAll -AutoReboot"
$trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Sunday -At 2am
Register-ScheduledTask -TaskName "MonthlyPatching" -Action $action -Trigger $trigger -User "SYSTEM" -RunLevel Highest
# WSUS configuration via Group Policy (registry keys)
# HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate
# WUServer = http://wsus.corp.example.com:8530
# WUStatusServer = http://wsus.corp.example.com:8530
イベントログの分析
# View the 50 most recent System log errors
Get-EventLog -LogName System -EntryType Error -Newest 50
# Search for specific event IDs (e.g., unexpected shutdowns = 6008)
Get-EventLog -LogName System -InstanceId 6008
# Use Get-WinEvent for advanced filtering (newer cmdlet)
Get-WinEvent -FilterHashtable @{
LogName = 'Application'
Level = 2 # Error
StartTime = (Get-Date).AddDays(-1)
} | Select-Object TimeCreated, Id, Message -First 20
# Search Security log for failed logons (Event ID 4625)
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4625
} | Select-Object TimeCreated, @{N='Account';E={$_.Properties[5].Value}}, @{N='Source';E={$_.Properties[19].Value}} -First 30
# Export events to CSV for analysis
Get-WinEvent -FilterHashtable @{ LogName='System'; Level=1,2 } |
Export-Csv -Path C:\Logs\system-errors.csv -NoTypeInformation
# Clear old event log entries (use cautiously)
Clear-EventLog -LogName Application
# Set maximum log size
Limit-EventLog -LogName Application -MaximumSize 512MB -OverflowAction OverwriteAsNeeded
スケジュールされたタスク
# Create a scheduled task to run a script daily at 3 AM
$action = New-ScheduledTaskAction -Execute "powershell.exe" `
-Argument "-NoProfile -File C:\Scripts\daily-maintenance.ps1"
$trigger = New-ScheduledTaskTrigger -Daily -At 3am
$settings = New-ScheduledTaskSettingsSet -StartWhenAvailable -DontStopOnIdleEnd
Register-ScheduledTask -TaskName "DailyMaintenance" -Action $action -Trigger $trigger -Settings $settings -User "SYSTEM"
# List all scheduled tasks
Get-ScheduledTask | Where-Object { $_.State -ne 'Disabled' } | Select-Object TaskName, State, TaskPath
# Run a task immediately
Start-ScheduledTask -TaskName "DailyMaintenance"
# Disable and remove a task
Disable-ScheduledTask -TaskName "DailyMaintenance"
Unregister-ScheduledTask -TaskName "DailyMaintenance" -Confirm:$false
トラブルシューティング
| 症状 | 診断コマンド | 一般的な対処法 |
|---|---|---|
| IIS サイトが 503 を返す | Get-WebAppPoolState | アプリケーションプールを再起動し、イベントログでクラッシュを確認します |
| サーバーの CPU 使用率が高い | Get-Process | Sort CPU -Desc | プロセスを特定し、w3wp またはサービスの暴走がないか確認します |
| ディスクの空き容量が少ない | Get-PSDrive -PSProvider FileSystem | 一時ファイル、IIS ログ、Windows Update キャッシュを削除します |
| AD アカウントがロックアウトされる | Search-ADAccount -LockedOut | Unlock-ADAccount を実行し、セキュリティログでロックアウトの発生元を確認します |
| Windows Update が失敗する | Get-WindowsUpdate -Verbose | sfc /scannow を実行し、更新コンポーネントをリセットします |
| サービスの起動に失敗する | Get-EventLog -LogName System -Newest 20 | 依存関係、資格情報、ポートの競合を確認します |
| RDP 接続が拒否される | Get-ItemProperty 'HKLM:\System\...\Terminal Server' | RDP が有効であり、ファイアウォールでポート 3389 が許可されていることを確認します |
| DNS 名前解決に失敗する | Resolve-DnsName example.com | DNS サーバーの設定とフォワーダーの構成を確認します |
関連スキル
linux-administration-- クロスプラットフォームの比較とハイブリッド管理ssh-configuration-- Windows OpenSSH Server の SSH アクセスuser-management-- Linux のユーザー/グループ管理に対応する概念systemd-services-- Windows サービスおよびタスク スケジューラに相当する Linux の機能performance-tuning-- パフォーマンスの監視と最適化の手法
コメント
Markdown 対応