Windowsのbatファイルで忘れがちな書き方

tasklistコマンドを利用して設定ウィンドウが存在するか判定する。

@echo off
set windowtitle=設定
tasklist /FI "WINDOWTITLE eq %windowtitle%" | find "実行されていません" > nul
if %ERRORLEVEL% == 1 (
    echo %windowtitle%が存在します。
)
pause

batファイルで自身の多重起動を防止したい場合は下記のようにするとそれなりに防止できる。

@echo off
set windowtitle=test
tasklist /FI "WINDOWTITLE eq %windowtitle%" | find "実行されていません" > nul
if %ERRORLEVEL% == 1 (
    exit
)
title %windowtitle%
pause

taskkillコマンドを利用して設定ウィンドウを閉じる。

@echo off
set windowtitle=設定
taskkill /FI "WINDOWTITLE eq %windowtitle%"
pause

Windows11のPowerShellスクリプトでVPNサーバーに接続する

・VPNサーバーに接続できるよう事前に設定
・接続名は「会社」とする

下記のように設定ファイルを編集して確認を表示せずに接続するよう変更。

…
PreviewUserPw=0
…

PowerShellスクリプトを適当な名前で作成する。

$connectionName = "会社"
$result = ipconfig | Select-String $connectionName
if ($result -like "*" + $connectionName + "*") {
    echo "ok"
} else {
    rasphone -d $connectionName
}

下記のような感じで実行する。

powershell -ExecutionPolicy RemoteSigned -File connect-vpn.ps1

Windows11のブルースクリーンの原因を追求する

Windwos11がシャットダウンの最後に必ずブルースクリーンを表示するようになってしまい、その原因を突き止めることが目的。ブルースクリーンが表示する内容は下記のみで全く切り分けられない。

問題が発生したため、PC を再起動する必要があります。
自動的に再起動します。

この問題と可能な解決方法の詳細については、https://www.windows.com/stopcodeを参照してください。

サポート担当者に連絡する場合は、この情報を伝えてください:
停止コード: WDF_VIOLATION

MicrosoftのWEBサイトから「Windows SDK」のインストーラーをダウンロード、「Debugging Tools for Windows」のみを選択してインストールする。

WinDbgを起動して「File」→「Symbol File Path…」でシンボルパスを設定しておくと情報が多く手に入るかもしれないということで、とりあえず下記を設定しておく。
srv*C:\Users\user\symbols*https://msdl.microsoft.com/download/symbols

引き続きWinDbgで「File」→「Open Crash Dump…」でブルースクリーン発生時に保存されたMEMORY.DMPを開くと「esif_lf.sys」が原因と分かったので「Intel Dynamic Platform Thermal Framework」のドライバーを更新して不具合を解消した。

Microsoft (R) Windows Debugger Version 10.0.22621.755 AMD64
Copyright (c) Microsoft Corporation. All rights reserved.


Loading Dump File [C:\Users\user\Desktop\MEMORY.DMP]
Kernel Bitmap Dump File: Kernel address space is available, User address space may not be available.

Dump completed successfully, progress percentage: 100

WARNING: Whitespace at end of path element
Error: Empty Path.
WARNING: Whitespace at end of path element
Symbol search path is: SRV*C:\Users\user\symbols*https://msdl.microsoft.com/download/symbols

Executable search path is: 
WARNING: Whitespace at end of path element
Windows 10 Kernel Version 22000 MP (4 procs) Free x64
Product: WinNt, suite: TerminalServer SingleUserTS Personal
Edition build lab: 22000.1.amd64fre.co_release.210604-1628
Machine Name:
Kernel base = 0xfffff801`7de00000 PsLoadedModuleList = 0xfffff801`7ea29980
Debug session time: Fri Jan 20 12:14:18.541 2023 (UTC + 9:00)
System Uptime: 0 days 0:03:49.661
Loading Kernel Symbols
...............................................................
................................................................
..............................................................
Loading User Symbols

Loading unloaded module list
...................
For analysis of this file, run !analyze -v
1: kd> !analyze -v
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

WDF_VIOLATION (10d)
The Kernel-Mode Driver Framework was notified that Windows detected an error
in a framework-based driver. In general, the dump file will yield additional
information about the driver that caused this BugCheck.
Arguments:
Arg1: 000000000000000d, A power IRP was received for the device but the IRP was not
	requested by the device (the power policy owner). Possibly there
	are multiple power policy owners. Only one driver in the stack can
	be the power policy owner. A KMDF driver can change power policy
	ownership by calling the DDI WdfDeviceInitSetPowerPolicyOwnership.
Arg2: ffffe5838a695bd0, Device object pointer.
Arg3: ffffe5838d1ec010, Power IRP.
Arg4: ffffe58389f64db0, Reserved.

Debugging Details:
------------------

Unable to load image \SystemRoot\System32\drivers\esif_lf.sys, Win32 error 0n2

KEY_VALUES_STRING: 1

    Key  : Analysis.CPU.mSec
    Value: 4327

    Key  : Analysis.DebugAnalysisManager
    Value: Create

    Key  : Analysis.Elapsed.mSec
    Value: 13842

    Key  : Analysis.Init.CPU.mSec
    Value: 2030

    Key  : Analysis.Init.Elapsed.mSec
    Value: 26253

    Key  : Analysis.Memory.CommitPeak.Mb
    Value: 104

    Key  : WER.OS.Branch
    Value: co_release

    Key  : WER.OS.Timestamp
    Value: 2021-06-04T16:28:00Z

    Key  : WER.OS.Version
    Value: 10.0.22000.1


FILE_IN_CAB:  MEMORY.DMP

DUMP_FILE_ATTRIBUTES: 0x1000

BUGCHECK_CODE:  10d

BUGCHECK_P1: d

BUGCHECK_P2: ffffe5838a695bd0

BUGCHECK_P3: ffffe5838d1ec010

BUGCHECK_P4: ffffe58389f64db0

DEVICE_OBJECT: ffffe5838a695bd0

IRP_ADDRESS: ffffe5838d1ec010

DRIVER_OBJECT: ffffe5838a9c4e30

IMAGE_NAME:  esif_lf.sys

MODULE_NAME: esif_lf

FAULTING_MODULE: fffff801967e0000 esif_lf

BLACKBOXBSD: 1 (!blackboxbsd)


BLACKBOXNTFS: 1 (!blackboxntfs)


BLACKBOXPNP: 1 (!blackboxpnp)


BLACKBOXWINLOGON: 1

PROCESS_NAME:  System

STACK_TEXT:  
fffff58e`a9d79568 fffff801`7fe8c6bc     : 00000000`0000010d 00000000`0000000d ffffe583`8a695bd0 ffffe583`8d1ec010 : nt!KeBugCheckEx
fffff58e`a9d79570 fffff801`7fe5b534     : ffffe583`8a8dd770 fffff58e`a9d79690 00000000`00000000 fffff58e`a9d796a0 : Wdf01000!FxVerifierBugCheckWorker+0x24 [minkernel\wdf\framework\shared\object\fxverifierbugcheck.cpp @ 68] 
fffff58e`a9d795b0 fffff801`7fe2c655     : ffffe583`8a8dd770 fffff58e`a9d79678 00000000`00000004 00000000`00000000 : Wdf01000!FxPkgFdo::DispatchDeviceSetPower+0x2ed68 [minkernel\wdf\framework\shared\irphandlers\pnp\fdopower.cpp @ 324] 
fffff58e`a9d79600 fffff801`7fe2b459     : ffffe583`8a8dd770 00000000`00000000 ffffe583`00000000 00000000`00000202 : Wdf01000!FxPkgFdo::_DispatchSetPower+0x25 [minkernel\wdf\framework\shared\irphandlers\pnp\fdopower.cpp @ 120] 
fffff58e`a9d79630 fffff801`7fe23d83     : ffffe583`8d1ec010 ffffe583`8d1ec010 ffffe583`8ccf4aa0 fffff58e`a9d79730 : Wdf01000!FxPkgPnp::Dispatch+0xd9 [minkernel\wdf\framework\shared\irphandlers\pnp\fxpkgpnp.cpp @ 771] 
fffff58e`a9d796a0 fffff801`7e1a29a7     : 00000000`00000100 00000000`00000000 00000000`00000000 00000000`00000000 : Wdf01000!FxDevice::DispatchWithLock+0x153 [minkernel\wdf\framework\shared\core\fxdevice.cpp @ 1447] 
fffff58e`a9d79710 fffff801`7e042a7d     : 00000000`80000000 00000000`00000000 00000000`00000100 fffff801`a45a9e1b : nt!IopPoHandleIrp+0x3b
fffff58e`a9d79740 fffff801`7e1a5e69     : 00000000`00000001 fffff58e`a9d79801 fffff801`78f9a101 00000000`00000000 : nt!IofCallDriver+0x6d
fffff58e`a9d79780 fffff801`a45a9db8     : ffffe583`8cd0a316 00000000`00000000 ffffe583`8ccf4aa0 00000000`00000000 : nt!IoCallDriver+0x9
fffff58e`a9d797b0 fffff801`a45b2288     : ffffe583`8cd0a330 00000000`0000000e 00000000`00000000 00000000`00000000 : WUDFRd!RdPnpTracker::RdPnpForwardToLowerDevice+0x80 [minkernel\wdf\framework\umdf\redirector\driver\pnp.cpp @ 2050] 
fffff58e`a9d79800 fffff801`a45b2123     : ffffffff`ffffffff 00000000`00000000 ffffe583`89410040 00000000`00000000 : WUDFRd!RdPnpTracker::RdPnpProcessor+0x318 [minkernel\wdf\framework\umdf\redirector\driver\pnp.cpp @ 1199] 
fffff58e`a9d798b0 fffff801`a45b1f51     : ffffe583`87fb3d40 00000000`00000000 00000000`00000000 00000000`00000100 : WUDFRd!RdPnpTracker::RdPnpProcessor+0x1b3 [minkernel\wdf\framework\umdf\redirector\driver\pnp.cpp @ 1131] 
fffff58e`a9d79960 fffff801`7e0afe6b     : 00000000`891ac3d0 ffffe583`87fb3d40 ffffe583`89110300 fffff801`7eb33680 : WUDFRd!RdPnpTracker::RdPnpCallbackAtPassiveInSystemProcess+0x11 [minkernel\wdf\framework\umdf\redirector\driver\pnp.cpp @ 2167] 
fffff58e`a9d79990 fffff801`7e08fb3f     : ffffe583`872bfaa0 ffffe583`89410040 ffffe583`87fb3d40 884e158d`00000000 : nt!IopProcessWorkItem+0xfb
fffff58e`a9d79a00 fffff801`7e154295     : ffffe583`89410040 ffff8c00`954f5000 ffffe583`89410040 0043806f`bd9bbfff : nt!ExpWorkerThread+0x14f
fffff58e`a9d79bf0 fffff801`7e220e34     : ffff8c00`954e6180 ffffe583`89410040 fffff801`7e154240 f39ee8cb`8bd08b20 : nt!PspSystemThreadStartup+0x55
fffff58e`a9d79c40 00000000`00000000     : fffff58e`a9d7a000 fffff58e`a9d74000 00000000`00000000 00000000`00000000 : nt!KiStartSystemThread+0x34


STACK_COMMAND:  .cxr; .ecxr ; kb

FAILURE_BUCKET_ID:  0x10D_d_IMAGE_esif_lf.sys

OS_VERSION:  10.0.22000.1

BUILDLAB_STR:  co_release

OSPLATFORM_TYPE:  x64

OSNAME:  Windows 10

FAILURE_ID_HASH:  {ceef9bfa-ef59-e1ba-c2b4-cd009412ae92}

Followup:     MachineOwner
---------

Windows11のbatファイルで物理メモリ容量を取得する

@echo off
setlocal enabledelayedexpansion
    set memoryinfo=
    for /f "usebackq tokens=*" %%i in (`wmic computersystem get TotalPhysicalMemory`) do (
        set memoryinfo=!memoryinfo!^%%i
    )
    set memory=
    for %%p in (%memoryinfo%) do (
        set test=number%%p
        set test=!test:0=!
        set test=!test:1=!
        set test=!test:2=!
        set test=!test:3=!
        set test=!test:4=!
        set test=!test:5=!
        set test=!test:6=!
        set test=!test:7=!
        set test=!test:8=!
        set test=!test:9=!
        if "!test!" == "number" (
            set memory=%%p
        )
    )
    set memory=%memory:~0,-3%
    echo %memory%KB
    set /a memory=%memory%/1000
    echo %memory%MB
    set /a memory=%memory%/1000
    echo %memory%GB
endlocal
pause

Windows10にすべてのFreeIPAユーザーと同名のローカルユーザーを作成する

前提条件

この手順で設定したIPAサーバー、この手順で設定したWindows10を使用する。

・ IPAサーバーではexpectコマンドをインストール済み
・ 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

:# 引数で渡されたリストでローカルにいないユーザーの作成
:# パスワードは実際のサインインには使用されないので固定値
:# パスワードの有効期限を無期限にする
:# 「Remote Desktop Users」グループに所属させる
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
		wmic useraccount where "Name='%%P'" set PasswordExpires=FALSE 1>NUL
		net localgroup "Remote Desktop Users" %%P /add 1>NUL
	)
)

endlocal

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

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

前提条件

・ Homeエディション
・ クライアントFQDNはwin01.local.example.com
・ クライアントのhostをKDC上で作成しておく
・ クライアントのkeytabを任意のパスワードで生成しておく
  (FreeIPAなら ipa-getkeytab -s dc1.local.example.com -p host/win01.local.example.com -k /etc/krb5.win01.keytab -P など)

PC名の変更

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

認証サーバーの設定

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

ksetup /setdomain LOCAL.EXAMPLE.COM
ksetup /setcomputerpassword keytab生成時に指定したパスワード
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