Open21

WinServer

sakusaku

★WindowsServer2025のインストールとADセットアップ

1. ISOのダウンロードとRufasでのインストール
2. IPの固定とサーバーホスト名の変更
3. 「サーバーマネージャー」から「役割と機能の追加」
4. インストールタイプの選択で「役割ベースまたは機能ベースのインストール」を選択
5. ローカルサーバーを選択
6. 「Active Directory ドメインサービス」と「DNSサービス」を選択
7. インストール開始
8. 大体40分ぐらい待つ

★Active Directory の設定

1. 「サーバーマネージャーの右上の通知欄→「このサーバーをドメインコントローラーに昇格します」をクリック
2. 「新しいフォレスト」を選択し、ドメイン名を指定(今回はsaku.com)
3. NetBIOS名の指定が必要なので、入力(今回はSAKU、大文字のみ)
4. オプションで「DNSサーバー」にチェックが入っていることを選択
5. Windows Server2025 の機能レベルを選択
6. インストールを実施

★DNSサーバーの設定

1. サーバーマネージャーのDNSを開き、「前方参照ゾーン」で新しいゾーンが作成されているかを確認(後方確認ゾーンは作成されない)
2. コマンドプロンプトからnslookup saku.comで名前解決が行われるか確認

★クライアント端末からドメイン参加

1. ネットワーク設定からDNSサーバーをADサーバーのIPに設定(今回は172.23.1.9)
2. システムの詳細設定から「コンピューター名」のタブへ移動し、変更からドメイン名を入力(saku.com)
3. OKもしくは適用を押し、サーバー側のDomain Adminsアカウントを入力
4. 成功すればOK

★アカウント作成→サインイン

1. ユーザー一覧から右クリックで新規→ユーザーで作成
2. ドメイン参加したクライアント端末からサインインし、入れればOK
sakusaku

★PC上のメモリ型番確認(Windows11移行)

wmicが使えなくなったので、

Get-WmiObject -Class Win32_PhysicalMemory
sakusaku

★ActiveDirectory フォルダリダイレクトの設定手順

<前提>
今回は共有ディレクトリをサーバーのローカルに作成。HomeとProfileの2つのディレクトリを作成してユーザーデータをそれぞれ保管する。ディレクトリはサインイン時に自動作成させる。

1. リダイレクト先のディレクトリを準備、今回はC:\UserProfile、C:\UserHomeを作成
2. それぞれのディレクトリを共有し、パスを保管しておく
3. 共有フォルダの権限を「Administrators、Authenticated Users」にし、フルコントロールで設定
4. ディレクトリの権限を「Administrators、Authenticated Users」をフルコントロール、「Users」を読み取りと実行で設定
5. ユーザーとグループでOUを作成し、その中に新規ユーザーを作成しておく(今回はOUがAllUsers、ユーザーをtest01)
6. GPOの設定画面を開き、作成したOUに紐づける形で新規ポリシーを作成(セキュリティフィルター等は変更なし)
7. 編集から、ユーザーの構成>ポリシー>Windowsの設定>フォルダーリダイレクトを選択
8. デスクトップなどリダイレクトしたいフォルダを選択し、「プロパティ」を表示
9. 設定から「基本ー全員のフォルダを同じ場所にリダイレクトする」を選択し、対象のフォルダの場所を「ルートパスの下に各ユーザーのフォルダーを作成する」を選択
10. その下のルートパスに、先ほどコピーした共有フォルダのパスを貼り付ける(参照から進めるとローカルになってうまくいかない)
11. OKを押して、グループポリシーエディタを閉じる(強制ONにしてもOK)

★Homeディレクトリの設定

1. ユーザーのプロパティ>プロファイルから、ローカルからドライブ名を指定
2. パスは共有フォルダのパスにユーザー名(別でもいいけど)を追加して記入(今回の場合だと\\共有名\UserHome\test01になる)
3. プロファイルパスも入れれば、移動プロファイルの設定も可能

★後はPCから該当ユーザーでサインインし、正常に動作するかを確認。

1. サインインし、適当なファイルをデスクトップとかに置く
2. 自動的にデータはサーバー側に上がるので、フォルダの所有者変更(Administrators)をしてサーバー側から同期されているか確認
3. フォルダの権限変更でユーザーから見えなくなるので、権限でAuthenticated Users)を入力すれば戻ってくる

https://shonanfujisawa.net/?p=1268

sakusaku

構築後のホスト名変更手順

→普通にコンピューター名を変更すると、DNS解決時などにエラー発生の可能性があるため、PowerShellから変更する。
※新しいコンピューター名には、ドメイン名も後ろに追加してFQDNで入力

# コンピューター名を追加する
netdom computername 現在のコンピューター名 /Add:新しいコンピューター名
# プライマリ名として変更
netdom computername 現在のコンピューター名 /Add:新しいコンピューター名
# 再起動して、古いコンピューター名を消去
netdom computername 新しいコンピューター名 /Remove:古いコンピューター名
# PTRレコードの修正
DNS逆引きレコード変更
sakusaku

WindowsServer セカンダリサーバー構築手順

WindowsServerのセカンダリを設定し、ADやDNS、DHCPを冗長化する。

  1. IPを固定し、DNSサーバーをプライマリーサーバーに向けて設定する

  2. ADとDNSの機能を追加する

  3. 通知内の「このサーバーをドメインコントローラーに昇格する」をクリック

  4. 「既存のドメインにドメインコントローラーを追加する」を選択し、ドメインを入力、資格情報を追加する

  5. ドメインコントローラーの機能等のチェックボックスはそのまま、DSRMのパスワードを入力

  6. DNSオプション、追加オプション、パスはそのまま次へ

  7. 前提条件のチェックが通過していればそのままインストールを開始

  8. 再起動がかかったあと、Powershellで以下のコマンドを実行

     dsquery server -forest → プライマリ、セカンダリの2つが入っていればOK
     repadmin /showrepl → すべて成功していればOK
     netdom /query fsmo → すべてプライマリのサーバーになっていればOK
    

DNSセカンダリ設定

  1. プライマリサーバー上で、DNS管理画面からレプリカを作成したいゾーンを右クリックし、プロパティを開く
  2. 「ゾーンの転送」タブに移動し、「ネームサーバータブの一覧にあるサーバーのみ」を選択
  3. 「ネームサーバー」タブに移動し、追加をクリック
  4. セカンダリサーバーのIPアドレスとホスト名をFQDNで入力しOK
  5. 前方参照ゾーン内にNSレコードが追加されていることを確認
  6. セカンダリサーバー上で、DNS管理画面からレプリカを作成したいゾーンを選択し、右クリック→「新しいゾーン」をクリック
  7. 次へで進み、「セカンダリゾーン」にチェックを入れて進む
  8. ゾーン名(任意だがプライマリと同じもので)を入力して次へ
  9. プライマリサーバーのIPを入れ、次へ
  10. ゾーン転送が完了されるため、作成したいゾーン内にNSレコードがそれぞれあることを確認
sakusaku

DHCPサーバーの設定

DHCPサーバーの冗長化として都合が良いため、WindowsServer上でDHCPサーバーを置く。

  1. 「役割と機能の追加」から、「DHCPサーバー」を選択
  2. インストールし、通知からDHCPサーバーの設定をクリック
  3. 資格情報が必要になるので、Administratorでコミット
  4. 完了になればOK
  5. スコープを作成するため、ツールからDHCP管理ページを開く
  6. IPv4を右クリックし、「新しいスコープ」をクリック
  7. スコープ名とIPリース範囲を入力し、ゲートウェイやDNSサーバーも入力
  8. WINSサーバーはとりあえず使用しないのでスルー
  9. 2台めにスレーブするため、そちらにもDHCPサーバーをインストール
  10. DHCPの管理画面から「操作」→「サーバーの追加」から、プライマリサーバーを選択して表示させる
  11. プライマリサーバーのIPv4を右クリックし、「フェイルオーバーの構成」をクリック
  12. レプリケートするサーバーを選択し、今回は負荷分散(事情でメイン20%セカンダリ80%)とし、共有のパスワードを設定
  13. あとは進めるとレプリケートを開始する
sakusaku

複数台WindowsServerがある場合の管理

サーバーマネージャーで一括して状態を確認できた方が良いので、
「管理」→「サーバーの追加」をクリックし、検索して必要なサーバーを追加しておくと一覧で確認できるので便利。
それぞれリモートする必要が少しなくなる。

sakusaku

WindowsServerの時刻同期(NTPクライアント)設定

# powershellで実行
    w32tm /query /peers
    →現在の同期先を表示
# 参照先のNTPサーバーを指定
    w32tm /config /update /manualpeerlist:172.23.1.2 /syncfromflags:manual
# 再度同期先を確認し、反映されていればOK
sakusaku

WindowsServer NICチーミング設定

  1. サーバーマネージャから、ローカルを選択
  2. NICチーミングの無効をクリック
  3. 名称を入力し、グループにするNICを選択(今回は本命ー予備で作成)
  4. 作成後、IPアドレスの設定(セカンダリにするときのDNSはプライマリサーバーを向けること)
sakusaku

データコピーバッチ(ミラー)

ログを追記しながら差分コピーを行う。コピー元が新しかったら更新。

@echo off
robocopy C:\test1 C:\test2 /B /MIR /COPYALL /R:1 /W:1 /NP /NFL /NDL /LOG+:C:\robocopylog\result.log
sakusaku

データコピーバッチ(増分)

ログを追記しながら増分コピー。

@echo off
robocopy C:\test1 C:\test2 /S /M /B /COPYALL /LOG+:C:\robocopylog\result.log
sakusaku

ZABBIX Agent2のインストール

WindowsServerをAgentインストールしてZABBIXに参加させる。

Windows Serverの設定

設定ファイルのダウンロード

  1. https://www.zabbix.com/download_agents のサイトからバージョンなどをそろえて、
    ・Encryption:No encryption
    ・Packaging:Archive
    で進めて、static.zipをダウンロード
    (バージョンの確認はdpkg -l | grep zabbixで見れる)
  2. ZIPを解凍して、C直下に「zabbix_agent」というディレクトリを作成する
  3. zabbix_agentディレクトリに、解凍された「bin」と「conf」をコピーする
  4. zabbix_agentディレクトリに「logs」ディレクトリを作成する

binディレクトリの設定

  1. binディレクトリの「zabbix_sender」を右クリックし、プロパティを開く
  2. 「互換性」タブに移動し、「管理者としてこのプログラムを実行する」にチェックを入れて適用

zabbix_agent2.confの編集

  1. conf/zabbix_agent2.confの内容を変更する

    #ログファイルのパスを変更する
    LogFile=C:\zabbix_agent\logs\zabbix_agent.log
    #サーバーを指定
    Server=<ZABBIXサーバーのIPもしくはホスト名を指定>
    ServerActive=<ZABBIXサーバーのIPもしくはホスト名を指定>
    #ホスト名を指定
    HostnameItem=system.hostname
    

ZabbixAgentのポート番号を許可

  1. 「WindowsDefenderファイアウォール」から「詳細設定」を開く
  2. 「受信の規則」から「新しい規則」を作成
  3. ポートを選択し、10050/TCPを指定し、接続を許可する
  4. 名前を適当に決める(今回はzabbix_agentにする)

Zabbix_Agentサービスの登録

  1. 以下のコマンドをPowerShellで実行

    #ディレクトリの移動
    cd c:\zabbix_agent\bin
    #サービスの登録を実施
    .\zabbix_agent2.exe -c 'c:\zabbix_agent\conf\zabbix_agent2.conf' -install
    #install Successfullyで完了
    
  2. サービスの一覧を開き、Zabbix Agentサービスを起動する

ZABBIX Serverの設定

  1. ホストの作成から、

    ホスト名:WindowsServerのホスト名
    表示名:デフォルト
    グループ:Templetes/Operating systems
    インターフェース:IPアドレス
    
  2. テンプレートは、「Templete OS Windows by Zabbix Agent」を選択

  3. ホストが追加されたことを確認する

sakusaku

Hyper-Vのセットアップ

リソースが余っているので、Hyper-VでalmaLinux9を立ち上げて、配信サーバーをこっちに乗せてみる。
https://qiita.com/nakazato_m26/items/73c9463da7f08a7aff55

Hyper-Vの有効化

  1. サーバーマネージャーから、「役割と機能の追加」を選択
  2. 「Hyper-V」を選択
  3. インストールを実施→再起動がかかる

Hyper-VでVM作成

  1. Hyper-Vマネージャーを起動し、仮想マシンの作成を進める
  2. メモリやHDDを適宜選択
  3. イメージファイル(ISO)をダウンロードしておき、インストールオプションの選択で「ブート(CD/DVD)」でISOを入れる
  4. 完了したら起動し、接続してみる
sakusaku

DNSの条件付きフォワーダーについて

DNSは、自ドメイン以外の問い合わせは基本的に指定したフォワーダーに対して転送する形になるが、例えば…

「pc.localに対する問い合わせだけ、特定のDNSサーバーへ転送したい!」

という場合は条件付きフォワーダーを設定する必要がある。

手順

  1. サーバーマネージャーからDNSを開く
  2. 条件付きフォワーダーを右クリックし、「新規条件付きフォワーダーを作成」をクリック
  3. 転送したいドメインを入力し、「マスターサーバー」に転送先のDNSサーバーのIPアドレスを入力
  4. 必要に応じてレプリケーションを有効にする
  5. クライアントPCからnslookupなどで確認
sakusaku

WindowsOSアップデート時のバージョンターゲット指定(ポリシー)

WindowsUpdateがかかる際のターゲットバージョンを指定することができる。

  1. グループポリシーの新規作成

  2. コンピューターの構成、ユーザーの構成ともにレジストリの変更

    #HKEY_LOCAL_MACHINEから変更
    キーパス:SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate
    値の名前:TargetReleaseVersion
    値の種類:REG_DWORD
    値のデータ:0x1(1)
    
    キーパス:SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate
    値の名前:TargetReleaseVersionInfo
    値の種類:REG_SZ
    値のデータ:24H2
    
    ※オプションはすべて「いいえ」で構成
    
sakusaku

グループポリシーの例外マシン、ユーザー指定

OUに含まれるマシンやユーザーのうち、例外的に外したいものがあったとする。
下層に別のOUを追加しても良いが、以下の手順で特定して外すことも可能。

  1. 該当のポリシーを選択
  2. 「委任」タブへ移動
  3. 「詳細設定」をクリックし、権限変更画面を表示させる
  4. 「追加」をクリックして、対象のユーザーやコンピューターを指定する
    ※検索して出てこない場合は、「オブジェクトの種類」で対象が外れていないか確認
  5. 選択後のセキュリティ設定画面で、「グループポリシーの適用」の「拒否」にチェックを入れる
  6. 拒否の方が優先されるよ、というアラート画面が表示されるのでそのまま進める
sakusaku

WSUSの有効化と構成

そのうちなくなる予定のローカルWSUSだが、機能として触ったことがないのはまずいと感じて構築を始める。
なくなる予定なのにWindowsServerの2025にも有効にできるんだ…。

WSUSの有効化

(事前準備)
どこかにWSUSの更新プログラムを保存するディレクトリを作成(今回はC:\WSUS)

  1. 管理→「役割と機能の追加」をクリック
  2. 役割と機能の追加ウィザードで「役割ベースまたは機能ベースのインストール」を選択
  3. サーバーを選択し進める
  4. サーバーの役割の選択で「Windows Server Update Service」を選択
  5. いくつか選択されるので、そのまま「機能の追加」をクリック
  6. サーバーの役割の選択も、特に触らず進める
  7. Webサーバーの役割(IIS)もそのまま進める
  8. 役割サービスの選択もそのまま
  9. Windows Server Update Service も次へ出進める
  10. 役割サービスの選択は、「WID Connectivity」と「WSUS Service」を選択
  11. 更新プログラムの保存先(C:\WSUS)を入力
  12. インストールオプションの確認で内容を確認、インストールを実施

設定ウィザードの構成

  1. 品質向上プログラムに参加するかどうか進める
  2. アップストリームサーバーの選択だが、今回はプライマリなので「Microsoft Updateから同期する」を選択
  3. プロキシサーバーの設定画面に進むので、プロキシサーバーがあればここに設定
  4. アップストリームサーバーへ接続する、「接続の開始」をクリック
  5. 言語の選択は、「日本語」「英語」を選択
  6. プログラムの選択画面になるが、必要なものだけ選択すること!! 容量が逼迫するため。
  7. 最後に自動同期を開始するかを選択して、完了

グループポリシーを利用したWSUSの適用

  1. OUを作成し、ドメインに入っているPCを移動させる

  2. グループポリシーを作成し、以下の項目を設定

    ・[イントラネットのMicrosoft更新サービスの場所を指定する]

    ◎[コンピューターの構成]>[管理用テンプレート]>[Windowsコンポーネント]>[Windows Update]>[Windows Server Update Serviceから提供される更新プログラムの管理]
    ◎有効にする
    ◎オプション:イントラネットの更新サービスを設定する→http://<IPアドレス>:8530
    ◎オプション:イントラネット統計サーバーの設定→http://<IPアドレス>:8530
    

    ・[自動更新を構成する]

    ◎[コンピューターの構成]>[管理用テンプレート]>[Windowsコンポーネント]>[Windows Update]>[エンドユーザーエクスペリエンスの管理]
    ◎有効にする
    ◎自動更新の構成:自由だが、今回は4-自動ダウンロードしインストール日時を指定
    ◎0-毎日、03:00としている
    
  3. 画面更新を行い、ポリシーが登録されていることを確認

sakusaku

グループポリシーの強制更新時のエラー「グループポリシーの処理に失敗しました」

あるあるだから、改めてまとめ。
グループポリシーの変更後、クライアント側で以下のコマンドを実施した際、

gpupdate /force
ドメインコントローラーへのネットワークが接続が存在しないため、グループポリシーの処理に失敗しました。

と表示されることがある。

確認事項

まずは、適用状況を確認してエラーが起きていないかを確認する。

gpresult /f /H %userprofile%\GPResult.html

HTMLファイルを開き、エラーを確認する。
タイムアウトしました。などのエラーであればドメインの再参加で解決できる。

対応策

ドメインから一旦WORKGROUPに外し、再度ドメインに参加させる。
タイムアウトが原因の場合は、レジストリに以下の内容を設定することで改善することがある。

レジストリ サブキー: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Netlogon\Parameters
値の名前: ExpectedDialupDelay
データ型: REG_DWORD
データ値が秒単位 (既定値 = 0)
データ範囲は 0 ~ 600 秒 (10 分)

https://learn.microsoft.com/ja-jp/troubleshoot/windows-server/group-policy/netlogon-event-id-5719-or-group-policy-event-1129

今回は、ドメインの再参加で解決している。

sakusaku

ユーザー削除時のPowershellコマンド

アカウントの削除があった場合、
・アカウントの無効化
・ユーザープロファイルの移動
・説明分に追記
を実施したい。
微妙に手間だったので自動化させてみる。

ユーザー情報の取得

Powershellでのユーザー情報取得は、以下のコマンドで実施する。

Get-ADUser -Identity "ユーザーID"

ただ、IDがわからないこともあるので、苗字または名前で検索できるようにしておく。

Get-ADUser -filter {Surname -like "苗字"}
Get-ADUser -filter {Givenname -like "名前"}

あと、この後で説明文の追記をするために現在の説明内容を取得する必要があるのだが、一部のプロパティは取得時に指定しておく必要があった。

Get-ADUser -Identity "ユーザーID" -Properties Description

ユーザーアカウントの無効化

ユーザーアカウントの無効化は非常にシンプル。IDがわかればなんの問題もない。

Disable-ADAccount -Identity "ユーザー名"

OUの移動

アカウントの無効化は以下のコマンドで実施可能。CNやOU、DCを指定する必要がある。

Move-ADObject -Identity "CN=苗字 名前,OU=最下層,OU=その上,...,OU=最上層,DC=DC名1,DC=DC名2" -TargetPath "OU=移動先,DC=DC名1,DC=DC名2"

ターゲットの指定時はユーザーの情報は不要になる。基本は最下層→そのうえ→最上層、DCの順番で書いている。

説明文の追記

ユーザーに設定している説明文に、今あるものを残して「【削除】」と頭につけたい。
一発だとわからなくなりそうなので、変数に入れて操作してみた。

$user = Get-ADUser -Identity "ユーザーID" -Properties Description
$newDescription = "【削除】" + $user.Description
Set-ADUser -Identity $user -Description $newDescription

これで上手くいったが、最初のユーザー取得でプロパティ指定していないとDescriptionが取得できないので、【削除】しか表示されないので注意。

フォルダ移動

あとはユーザーに紐づくフォルダをバックアップ用のフォルダに移動して終了。
ここでは、取得したユーザー情報から「SamAccountName」というプロパティを使用する。

$user = Get-ADUser -Identity "ユーザーID"
$SrcProFolder = "フォルダパス\" + $user.SamAccountName
$DstProFolder = "フォルダパス\backup"
Move-Item -Path $SrcProFolder -Destination $DstProFolder

まとめ

全体をまとめると以下のように。

$user = Get-ADUser -Identity "ユーザーID" -Properties Description
$newDescription = "【削除】" + $user.Description
$SrcProFolder = "フォルダパス\" + $user.SamAccountName
$DstProFolder = "フォルダパス\backup"

Disable-ADAccount -Identity $user
Move-ADObject -Identity "CN=苗字 名前,OU=最下層,OU=その上,...,OU=最上層,DC=DC名1,DC=DC名2" -TargetPath "OU=移動先,DC=DC名1,DC=DC名2"
Set-ADUser -Identity $user -Description $newDescription
Move-Item -Path $SrcProFolder -Destination $DstProFolder

数が多いと面倒なことがあったので、いい機会ということで試してみた。
勉強にもなったし、ちょっと楽ができたからいいかな。

sakusaku

プリンターサーバーのスプールデータ削除バッチ

プリンターサーバー内に印刷に失敗したファイルが残ってしまい、クライアント側から削除できなくなってしまうことがちょこちょこ発生。

いつも手作業で消していたが、いちいちサービス止めたりするのが面倒になったので、簡単なバッチを作った。

バッチ内容

@echo off

REM スプールサービスの停止
net stop "Print Spooler"

REM スプールデータの全削除
del /q C:\Windows\System32\spool\PRINTERS\*

REM スプールサービスの再起動
net start "Print Spooler"
echo. 各プリンターのキューを確認してください。

REM 時間調整
timeout 2

REM フォルダ内に拡張子.splが残っているか検索し、結果は表示しない
dir C:\Windows\System32\spool\PRINTERS | findstr "spl" > nul

REM うまく削除できていれば何も見つからず、errorlevelが1になるのを利用して判定
if errorlevel 1 (
 echo すべて削除しました。
 start C:\Windows\System32\spool\PRINTERS
) else (
 echo スプールデータが残っています。
 start C:\Windows\System32\spool\PRINTERS
)

pause

補足

delコマンドのオプション

/q
→削除後に確認メッセージを表示しない

/p
→確認メッセージを表示する

/f
→読み取りファイルも削除する

/s
→指定したファイル名をサブディレクトリも含めて、すべて削除する

errorlevelと%errorlevel%の違い

やりたいことは同じなのだが、ifで判定する場合の書き方が異なってくる。

if %errorlevel% equ 1 → errorlevelが1の場合
if errorlevel 1 →errorlevelが1以上の場合

%errorlevel%の場合は他の変数と同様に、equ 1 を使って判定させるが、errorlevelの場合はequを使わずにそのまま数値を指定する。
なので、変数でないerrorlevelを使う場合は、ifと組み合わせて決まった文法で使うことになる。
今回は別のエラーが表示される可能性があったので、errorlevelで作成している。