FreeIPAサーバーからIPAユーザーとWindows10のローカルユーザーを同期する

前提条件

この手順で設定したIPAサーバーを使用する
・IPAサーバーではexpectコマンドをインストール済み
この手順で設定したWindows10を使用する
・Windows10には設定からsshdをインストール済み

スクリプトの流れ

①FreeIPAサーバーですべてのIPAユーザーを取得してカンマ区切りに加工する
②expectコマンドを使用してWindowsにsshで接続する
③Windows上でユーザーの削除と追加を行うスクリプトに「①」で取得したユーザーリストを送信する

IPAサーバーのスクリプト

cronで定期的に実行するとWindowsの管理が少し楽になるかもしれない。
Windowsの台数が多い場合はsamba4のActiveDirectory使ったほうが良い。

#!/bin/bash

# Kerberosユーザーをすべて取得する
# IPAユーザー以外でログインしている場合はkinitが必要
# echo 'password' | kinit admin
USERS=`ipa user-find | grep "User login:*" | sed "s/  User login: //g" | sed -z "s/\n/,/g"`

# Windowsクライアントにsshで接続して専用batファイルを実行する
# WindowsのIPアドレスは192.168.0.100
# Administratorのパスワードは12345678
HOST="192.168.0.100"
expect -c "
	spawn ssh administrator@$HOST
	expect \"password:\"
	send 12345678\\n
	expect \"Microsoft Windows\"
	send \"C:\\\\Script\\\\UpdateUserAccounts.bat \\\"$USERS\\\"\r\n\"
	expect \"ユーザーリストの更新が完了しました。\"
	send exit\r\n
	interact
"

Windows10のスクリプト

ここではローカルにスクリプト置いてるけど、samba共有に置いた方が管理しやすいかも。

:# ※引数として渡されるユーザーリストはカンマ区切りで末尾にもカンマが必要
@echo off
set parameters=%~1
set domain=LOCAL.EXAMPLE.COM

setlocal enabledelayedexpansion

:# 引数で渡されたリストにいないユーザーの削除
set wmicresult=
for /f "usebackq tokens=*" %%P in (`wmic useraccount where "fullname LIKE '%%@%domain%'"`) do (
	set wmicresult=!wmicresult!%%P 
)
for %%P in (%wmicresult%) do (
	echo %%P | find "%domain%" 1>NUL
	if not ERRORLEVEL == 1 (
		set localname=%%P
		set localname=!localname:@%domain%=!
		echo !parameters! | find "!localname!," 1>NUL
		if ERRORLEVEL == 1 (
			net user !localname! /del 1>NUL
			rmdir /s /q !systemdrive!\Users\!localname! 1>NUL 2>NUL
		)
	)
)

:# 引数で渡されたリストでローカルにいないユーザーの作成
:# パスワードは実際のサインインには使用されないので固定値
set password=87654321
for %%P in (%parameters%) do (
	net user %%P 1>NUL 2>NUL
	if ERRORLEVEL == 1 (
		net user %%P %password% /add /expires:never /fullname:%%P@%domain% 1>NUL
	)
)

endlocal

echo ユーザーリストの更新が完了しました。

Windows10にkerberos認証でサインインする

前提条件

・WindowsクライアントはHomeでもProでも良い
・ここでのクライアントFQDNはwin01.local.example.com
・事前にクライアントのhostをKDC上で作成しておく

PC名の変更

はじめにPC名をwin01にしておく。

認証サーバーの設定

コマンドプロンプトを管理者として起動し下記コマンドを実行する。

ksetup /setdomain LOCAL.EXAMPLE.COM
ksetup /addkdc LOCAL.EXAMPLE.COM dc1.local.example.com
ksetup /addkpasswd LOCAL.EXAMPLE.COM dc1.local.example.com
ksetup /mapuser * *

再起動と確認

Windowsを再起動して、フルコンピュータ名がwin01.local.example.comのようなFQDNになっていることを確認する。

暗号化の種類を構成

レジストリを編集して、Kerberosで許可する暗号化の種類を構成する。
RC4_HMAC_MD5・AES128_HMAC_SHA1・AES256_HMAC_SHA1を有効にするのが目的。
※gpedit.mscが使えるならGUIで設定しても良い

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Kerberos\Parameters]
"SupportedEncryptionTypes"=dword:0000001c

ローカルアカウントの作成

kerberos認証でサインインするユーザーと同名のローカルアカウントを作成する。
※実際の認証には使われないがパスワードは管理者側で何か設定した方が良い

実際のサインイン

サインインする際は「user@LOCAL.EXAMPLE.COM」のようにrealmをつけて行う。

Windows10でシンボリックリンクを作成する

ショートカットとは扱いが少し違うようだ。たぶんWin7でも使える。

# 管理者としてコマンドプロンプトを起動
# ドキュメントのtextfile.txtのシンボリックリンクをデスクトップに作成する
mklink C:\Users\user\Desktop\textfile_link.txt C:\Users\user\Documents\textfile.txt
# Dドライブのworkディレクトリに対するリンクをデスクトップに作成する
mklink /D C:\Users\user\Desktop\work D:\work

CentOS7にWindowsからリモートデスクトップ

GNOME入ってなかったら入れて。

# yum groupinstall "GNOME Desktop"

xrdpのインストール。

# yum install epel-release
# yum install xrdp
# yum install tigervnc-server

/etc/xrdp/xrdp.iniの下記箇所を変更する。

#max_bpp=32
max_bpp=24

ファイアウォールに例外を登録する。

# firewall-cmd --add-port=3389/tcp --permanent
# firewall-cmd --reload

サービスを有効にして、起動。

# systemctl enable xrdp
# systemctl start xrdp

Windowsストアアプリを削除する

PowerShellで下記コマンドを実行し、削除したいアプリのnameを確認する。

Get-AppxPackage "*検索値*"

同じくPowerShellで下記コマンドを実行して削除する。

Get-AppxPackage [前手順で確認したName] | Remove-AppxPackage

batファイルでOS毎に処理を分岐させる

verコマンドの結果を取得して分岐処理する。

@echo off

for /f "usebackq tokens=*" %%i in (`ver`) do set version=%%i
if not "%version:Version 10=%" == "%version%" goto WIN10
if not "%version:Version 6.3=%" == "%version%" goto WIN8.1
if not "%version:Version 6.2=%" == "%version%" goto WIN8
if not "%version:Version 6.1=%" == "%version%" goto WIN7
goto FIN

:WIN10
echo win10
goto FIN

:WIN8.1
echo win8.1
goto FIN

:WIN8
echo win8
goto FIN

:WIN7
echo win7
goto FIN

:FIN

pause

コマンドプロンプトでアクセス権を変更する

フォルダ C:\test 及び以下のサブフォルダとファイルに Administrator をフルコントロールで追加する。

icacls C:\test /grant Administrator:(OI)(CI)F /T

フォルダ C:\test 及び以下のサブフォルダとファイルに test-user を読み取りと実行権限で追加する。

icacls C:\test /grant test-user:(OI)(CI)RX /T

フォルダ C:\test 及び以下のサブフォルダとファイルに test-group を変更権限で追加する。

icacls C:\test /grant test-user:(OI)(CI)M /T

フォルダ C:\test 及び以下のサブフォルダとファイルの所有者を Administrators に変更する。

icacls C:\test /setowner Administrators /T

ファイル C:\text.txt のアクセス権から Administrators を削除する。

icacls C:\test.txt /remove Administrators

ディスクの管理で削除できないEFIなどの特殊なパーティションを削除する

1. 管理者としてコマンドプロンプトを実行

2. 下記コマンドを実行しDISKPARTを起動
 diskpart

3. ディスク一覧を見る
 list disk

4. ディスクを選択する
 select disk [3で確認したディスクNo]

5. パーティション一覧を見る
 list partition

6. パーティションを選択する
 select partition [5で確認したパーティションNo]

7. パーティションを削除
 delete partition override

8. 終了させる
 exit

WindowsでSSID毎に設定を変更するbatファイル

下記内容でbatファイルを作成する。
更に同ディレクトリにSSIDと同じ名前のbatファイルを作成しておき、それぞれの処理を記述する。設定対象外のSSID用の処理はother.batに記述して同じく配置する。
作成した下記内容のbatファイルをタスクスケジューラに登録し、任意のタイミング、任意の権限で自動実行させると良いと思います。

setlocal enabledelayedexpansion
    :: netshの結果を取得する
    set netshresult=
        for /f "usebackq tokens=*" %%i in (`netsh wlan show interfaces`) do (
            set netshresult=!netshresult!^
        %%i)
    :: 設定1
    set ssid=test-ssid1
    call set compare=%%netshresult:%ssid%=%%
    if not "%netshresult%" == "%compare%" goto CHANGE
    :: 設定2
    set ssid=test-ssid2
    call set compare=%%netshresult:%ssid%=%%
    if not "%netshresult%" == "%compare%" goto CHANGE
    :: その他のSSID
    set ssid=other
    :: 変更処理
    :CHANGE
    :: SSIDと同じ名前のbatファイルを呼び出す
    call %~dp0\%ssid%.bat
    :END
endlocal