以前に VBScript(WSH)を使って、Windows 起動時に Nextcloud をネットワークドライブに割り当てる方法を説明しました。

Microsoft は 2023年10月、VBScript を非推奨(deprecated)とすることを発表しました。
Windows 11 24H2 の時点では Features on Demand(FOD)として標準搭載・既定で有効ですが、2027年頃には既定で無効化され、その後 Windows から完全に削除される予定です。
そこで今回は VBScript ではなく PowerShell を使う方法に切り替えます。
また、スクリプトに平文パスワードを記載するのを止め、Nextcloud のアプリパスワード機能を使って WebDAV 専用のパスワードを発行することで漏洩時のリスクを低下するように改良しました。
PowerShell を管理者として実行
PowerShell を管理者として実行して、WebDAV の設定を見直します。

WebClient サービスを自動起動
WebClient(WebDAV)サービスは既定だと開始されないため、自動的に起動するように設定します。
Set-Service -Name WebClient -StartupType Automatic
Start-Service -Name WebClient
WebDAV のファイルサイズ制限
Windows の WebDAV ファイルサイズ上限は、デフォルトで約 50MB に制限されているので、まずは現状のサイズを確認します。
$P = "HKLM:\SYSTEM\CurrentControlSet\Services\WebClient\Parameters"
Get-ItemProperty -Path $P | Select-Object -Property CacheLifeTime, FileSizeLimitInBytes, BasicAuthLevel
(out)
(out) CacheLifeTime FileSizeLimitInBytes BasicAuthLevel
(out) ------------- -------------------- --------------
(out) 50000000 150MB に制限されていたので、4GB に拡大しておきます。
$P = "HKLM:\SYSTEM\CurrentControlSet\Services\WebClient\Parameters"
Set-ItemProperty -Path $P -Name FileSizeLimitInBytes -Value 4294967295 -Type DWord
Restart-Service WebClient
(out)
Get-ItemProperty -Path $P | Select-Object -Property CacheLifeTime, FileSizeLimitInBytes, BasicAuthLevel
(out)
(out) CacheLifeTime FileSizeLimitInBytes BasicAuthLevel
(out) ------------- -------------------- --------------
(out) 4294967295 1接続失敗キャッシュの無効化
WebDAV クライアントは接続に失敗したサーバーを一定時間キャッシュし、その間の再試行は実際に接続せず即失敗となります。
必要に応じて ServerNotFoundCacheLifeTimeInSec の値を 0(無効)に変更しておくと良いでしょう。
Set-ItemProperty -Path $P -Name ServerNotFoundCacheLifeTimeInSec -Value 0 -Type DWord
Restart-Service WebClient管理者としての PowerShell 操作はここまでなので、終了しておきましょう。
Nextcloud でアプリパスワードを発行
Nextcloud にユーザーでログインし、設定 > セキュリティ を開き、「デバイスとセッション」の最下部の入力欄にアプリ名(デバイス名など)を入力し、新しいアプリパスワードを作成します。

アプリパスワードは一度しか表示されないので、設定が終わるまで閉じないようにしておきます。
PowerShell(ユーザー権限で実行)
ここからは PowerShell をユーザー権限で開いて作業をしていきます。

フォルダーの作成と認証情報の暗号化保存
$Dir = "$env:LOCALAPPDATA\Nextcloud"
New-Item -ItemType Directory -Force -Path $Dir | Out-Null
(out)
(out) # ↓ は置き換えずこのまま貼り付け
Read-Host "アプリパスワードを貼り付け" -AsSecureString |
ConvertFrom-SecureString | Set-Content -Path "$Dir\nc.cred" -Encoding ASCII
(out) アプリパスワードを貼り付け: *****************************Nextcloud で発行したアプリパスワードをコピーし、PowerShell 上で右クリックすれば貼り付けることができます。
マウントスクリプト
メモ帳を開き、下記のスクリプトを貼り付けます。
$Server と $UserId は自身の環境に合わせて変更してください。
#Requires -Version 5.1
Set-StrictMode -Version Latest
# ===== 設定 =====
$Server = 'https://example.com' # 末尾スラッシュなし
$UserId = 'username' # Nextcloud のログイン ID
$Drive = 'X' # ドライブレター
$Label = 'Nextcloud' # ボリュームラベル
$Interval = 5
$MaxRetry = 25 # 5秒 x 25回(失敗キャッシュ既定値の60秒より長い)
$CredPath = "$env:LOCALAPPDATA\Nextcloud\nc.cred"
# ================
$Url = "$Server/remote.php/dav/files/$([uri]::EscapeDataString($UserId))/"
function Test-Mapped { Get-CimInstance Win32_NetworkConnection `
-Filter "LocalName='${Drive}:'" -ErrorAction SilentlyContinue }
# マウント済なら何もしない
if ((Test-Mapped) -and (Test-Path "${Drive}:\")) { exit 0 }
# 割り当てだけ残った切断状態を掃除
if (Test-Mapped) { & net use "${Drive}:" /delete /y | Out-Null }
# WebClient の起動を待つ
try { (Get-Service WebClient).WaitForStatus('Running', '00:01:00') } catch {}
# DPAPI から復号
$Sec = ConvertTo-SecureString ((Get-Content $CredPath -Raw).Trim())
$Bstr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($Sec)
$Pw = [Runtime.InteropServices.Marshal]::PtrToStringBSTR($Bstr)
try {
$Net = New-Object -ComObject WScript.Network
for ($i = 1; $i -le $MaxRetry; $i++) {
try {
$Net.MapNetworkDrive("${Drive}:", $Url, $false, $UserId, $Pw)
break
} catch {
if ($i -eq $MaxRetry) { throw }
Start-Sleep -Seconds $Interval
}
}
} finally {
[Runtime.InteropServices.Marshal]::ZeroFreeBSTR($Bstr)
Remove-Variable Pw -ErrorAction SilentlyContinue
}
# ボリュームラベル設定(シェル認識待ち + Nothing チェック)
Start-Sleep -Seconds 2
$Ns = (New-Object -ComObject Shell.Application).NameSpace("${Drive}:\")
if ($Ns) { $Ns.Self.Name = $Label }%LOCALAPPDATA%\Nextcloud に Mount-Nextcloud.ps1 として保存します。

タスクスケジューラに登録
PowerShell からタスクスケジューラに登録します。
$Script = "$env:LOCALAPPDATA\Nextcloud\Mount-Nextcloud.ps1"
$Action = New-ScheduledTaskAction -Execute 'powershell.exe' `
-Argument "-NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File `"$Script`""
$Trigger = New-ScheduledTaskTrigger -AtLogOn -User "$env:USERDOMAIN\$env:USERNAME"
$Trigger.Delay = 'PT15S'
$Settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries `
-DontStopIfGoingOnBatteries -StartWhenAvailable `
-RestartInterval (New-TimeSpan -Minutes 1) -RestartCount 3 `
-ExecutionTimeLimit (New-TimeSpan -Minutes 10)
$Principal = New-ScheduledTaskPrincipal -UserId "$env:USERDOMAIN\$env:USERNAME" `
-LogonType Interactive -RunLevel Limited
Register-ScheduledTask -TaskName "Mount Nextcloud - $env:USERNAME" `
-Action $Action -Trigger $Trigger -Settings $Settings -Principal $Principal
(out)
(out) TaskPath TaskName State
(out) -------- -------- -----
(out) \ Mount Nextcloud - username Ready確認
タスクスケジューラを手動で実行し、エラーが出ないか確認しておきます。
Start-ScheduledTask -TaskName "Mount Nextcloud - $env:USERNAME"マウントされたか確認しておきましょう。
Get-ScheduledTaskInfo -TaskName "Mount Nextcloud - $env:USERNAME"
(out)
(out) LastRunTime : 2026/08/28 12:00:00
(out) LastTaskResult : 0
(out) NextRunTime :
(out) NumberOfMissedRuns : 0
(out) TaskName : Mount Nextcloud - username
(out) TaskPath :
(out) PSComputerName :
(out)
Get-PSDrive X
(out)
(out) Name Used (GB) Free (GB) Provider Root CurrentLocation
(out) ---- --------- --------- -------- ---- ---------------
(out) X 500.00 250.00 FileSystem \\example.com@SSL\DavW...LastTaskResult が 0 なら成功です。
PC を再起動して自動的に X ドライブがマウントされているか確認します。
念のため、大きいファイル(50MB 以上)がきちんとコピーされるか確認しておいた方が良いでしょう。
まとめ
VBScript 版で不安定だった部分を解消しつつ、端末紛失時もアプリパスワードを削除するだけの形に改良する事ができました。

コメント