Windows ログイン時に Nextcloud をネットワークドライブに割り当てる(PowerShell 版)

Nextcloud Windows
このサイトはアフィリエイト広告(Amazonアソシエイト含む)を掲載しています。
スポンサーリンク

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

Windows 起動時に Nextcloud をネットワークドライブに割り当てる
Windows 起動時に Nextcloud(WebDAV)をネットワークドライブとして自動マウントする方法。WSH(VBScript)でドライブを割り当てるスクリプトを作り、スタートアップに登録する手順を解説します。

Microsoft は 2023年10月、VBScript を非推奨(deprecated)とすることを発表しました。

Windows 11 24H2 の時点では Features on Demand(FOD)として標準搭載・既定で有効ですが、2027年頃には既定で無効化され、その後 Windows から完全に削除される予定です。

そこで今回は VBScript ではなく PowerShell を使う方法に切り替えます。

また、スクリプトに平文パスワードを記載するのを止め、Nextcloud のアプリパスワード機能を使って WebDAV 専用のパスワードを発行することで漏洩時のリスクを低下するように改良しました。

以前の記事を参考に VBScript 版の設定をされた方は、スタートアップ(ファイル名を指定して実行(Win + R)で shell:startup と入力)のフォルダーから Nextcloud.vbs を削除しておいてください。

PowerShell を管理者として実行

PowerShell を管理者として実行して、WebDAV の設定を見直します。

共有 PC などで複数ユーザーがログインする場合は、管理者権限の操作は一度行えば良く、繰り返して行う必要はありません。

WebClient サービスを自動起動

WebClient(WebDAV)サービスは既定だと開始されないため、自動的に起動するように設定します。

Set-Service -Name WebClient -StartupType Automatic
Start-Service -Name WebClient
Windows クライアントの非推奨機能
Microsoft が Windows 10 および Windows 11 で積極的に開発しなくなった機能の一覧を確認します。

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              1

50MB に制限されていたので、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 として保存します。

スクリプトに日本語が含まれるため、UTF-8(BOM 付き)で保存しないとエラーになります。

タスクスケジューラに登録

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

USERDOMAIN や USERNAME は置き換えずにそのままコピペで OK です。

確認

タスクスケジューラを手動で実行し、エラーが出ないか確認しておきます。

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 版で不安定だった部分を解消しつつ、端末紛失時もアプリパスワードを削除するだけの形に改良する事ができました。

コメント

タイトルとURLをコピーしました