前提・実現したいこと
リモート接続 で ネットワークドライブを割り当てたいです。
発生している問題・エラーメッセージ
ネットワークドライブの割当等を行う関数が
リモート環境だと失敗する
--追記-- 2018.10.11_9:55
$(net use $("Z" + ":") "\File-Server\Disk1")
実行時
エラーシステム エラー 58 が発生しました。
が発生
powershell
1net : システム エラー 58 が発生しました。 2 + CategoryInfo : NotSpecified: (システム エラー 58 が発生しました。:String) [], RemoteException 3 + FullyQualifiedErrorId : NativeCommandError 4 5指定されたサーバーは、要求された操作を実行できません。
該当のソースコード
MainScript.ps1 ↓
powershell
1#リモート操作# 2 3$ErrorActionPreference = "Stop" 4$Error.Clear() 5 6try 7{ 8#初期処理# 9 if (!($PSScriptRoot -eq "")) 10 { 11 #カレントディレクトリをスクリプトパスに設定 12 Set-Location -Path($PSScriptRoot) 13 } 14 #ライブラリパスの作成# 15 $PSScriptRoot = $(Convert-Path -Path $(Get-Location)) 16 $Library = "$PSScriptRoot\Library" 17 18 if (Test-Path -Path $Library) 19 { 20 #登録関数の削除 21 Remove-Item Function::_* 22 #ソースの取得 23 $SFuncs = $($(Get-ChildItem -Path $Library) | where {$_.Extension -eq ".ps1"} | foreach {$(Get-Content -Path $_.FullName) -join "`r`n"}) 24 #ソースの読み込み 25 $SFuncs | foreach {Invoke-Expression $_} 26 } 27 else 28 { 29 $PSScriptRoot = "" 30 $Library = "" 31 } 32 if ($(Get-Item function::_*).count -eq 0) 33 { 34 throw "関数が定義されていません。" 35 } 36 37 $PC_List = @([ordered]@{ 38 HostName = "PC01-PC" 39 UserName = "PC01" 40 PassWord = "PassWord" 41 },@{ 42 HostName = "PC02-PC" 43 UserName = "PC02" 44 PassWord = "PassWord" 45 },@{ 46 HostName = "PC03-PC" 47 UserName = "PC03" 48 PassWord = "PassWord" 49 },@{ 50 HostName = "PC04-PC" 51 UserName = "PC04" 52 PassWord = "PassWord" 53 },@{ 54 HostName = "PC05-PC" 55 UserName = "PC05" 56 PassWord = "PassWord" 57 },@{ 58 HostName = "PC06-PC" 59 UserName = "PC06" 60 PassWord = "PassWord" 61 },@{ 62 HostName = "PC07-PC" 63 UserName = "PC07" 64 PassWord = "PassWord" 65 },@{ 66 HostName = "PC08-PC" 67 UserName = "PC08" 68 PassWord = "PassWord" 69 },@{ 70 HostName = "PC09-PC" 71 UserName = "PC09" 72 PassWord = "PassWord" 73 },@{ 74 HostName = "PC10-PC" 75 UserName = "PC10" 76 PassWord = "PassWord" 77 },@{ 78 HostName = "PC11-PC" 79 UserName = "PC11" 80 PassWord = "PassWord" 81 },@{ 82 HostName = "PC12-PC" 83 UserName = "PC12" 84 PassWord = "PassWord" 85 },@{ 86 HostName = "PC13-PC" 87 UserName = "PC13" 88 PassWord = "PassWord" 89 },@{ 90 HostName = "PC14-PC" 91 UserName = "PC14" 92 PassWord = "PassWord" 93 },@{ 94 HostName = "PC15-PC" 95 UserName = "PC15" 96 PassWord = "PassWord" 97 },@{ 98 HostName = "PC16-PC" 99 UserName = "PC16" 100 PassWord = "PassWord" 101 },@{ 102 HostName = "PC17-PC" 103 UserName = "PC17" 104 PassWord = "PassWord" 105 },@{ 106 HostName = "PC18-PC" 107 UserName = "PC18" 108 PassWord = "PassWord" 109 },@{ 110 HostName = "PC19-PC" 111 UserName = "PC19" 112 PassWord = "PassWord" 113 },@{ 114 HostName = "PC20-PC" 115 UserName = "PC20" 116 PassWord = "PassWord" 117 } 118) 119 $PS_List = $PC_List | foreach{New-Object psobject -Property $_} 120 121 122 $Info = $PS_List | where {$_.UserName -like "PC01"} 123 124 if ($Info -eq $null) 125 { 126 return $false 127 } 128 129 # セキュアストリングの作成(パスワードの暗号化) 130 $sec_str = ConvertTo-SecureString $Info.PassWord -AsPlainText -Force 131 132 # Credential オプションに指定するオブジェクトのインスタンス生成 133 $psc = New-Object System.Management.Automation.PsCredential($Info.UserName, $sec_str) 134 135 # New-PSSession コマンドによるセッションの生成 136 $sess = New-PSSession -ComputerName $Info.HostName -Credential $psc 137 138 if ($sess -ne $null) 139 { 140 #Get-PSSession # セッションの確認 141 Invoke-Command -Session $sess -ScriptBlock {$args[0] | foreach {Invoke-Expression $_}} -ArgumentList @($SFuncs,"") 142 143 $Block08 = { 144 "管理者権限 : $(_AuthorityValidation)" 145 _Set_Drive -Name "Z" -Root "\File-Server\Disk1" 146 _Get_DriveInfo -Name "Z" 147 } 148 149 # コマンドをリモートホスト上で実行する 150 Invoke-Command -Session $sess -ScriptBlock $Block08 151 $null = Remove-PSSession -Session $sess # セッションを削除 152 } 153 if ($Error.Count -ne 0) 154 { 155 $Info 156 } 157} 158 159catch 160{ 161 Write-Host $Error 162} 163
「MainScript.ps1」と同じ階層の「Library」フォルダ内のスクリプト
System.ps1 ↓
powershell
1<# 2 システム関連 3#> 4 5function _Set_Drive ([string]$Name, [string]$Root) { 6[OutputType([bool])] 7<# 8New-PSDrive -Name HKCC -PSProvider Registry -Root HKEY_CURRENT_CONFIG 9 10 ネットワークドライブ、又は仮想ドライブを設定する 11 12 [String]$Name 13 : 設定するドライブレターを指定します。 14 15 [String]$Root 16 : 設定するRootPathを指定します。 17 18 [Bool]返値 19 : 正常に完了したか 20#> 21 22 #ドライブの解除 23 $null = if(!(_Remove_Drive -Name $Name)) { 24 Write-Host "ドライブの解除に失敗しました" 25 return $false 26 } 27 28 #ドライブの設定 29 $ErrorActionPreference = "silentlycontinue" 30 switch ($Root) 31 { 32 {$_.Substring(0,2) -eq "\"} { 33 #ネットワークドライブの設定 34 [Bool]$Return = $(net use $($Name + ":") $Root)-as 'bool' 35 break 36 } 37 38 Default { 39 #仮想ドライブの設定 40 [Bool]$Return = !(subst $($Name + ":") $Root) 41 break 42 } 43 } 44 $ErrorActionPreference = "continue" 45 46 #再接続設定 47 $null = net use /persistent:yes 48 49return $Return 50} 51 52function _Remove_Drive ([string]$Name) { 53[OutputType([bool])] 54<# 55 ネットワークドライブ、又は仮想ドライブを解除する 56 57 [String]$Name 58 : 設定するドライブレターを指定します。 59 60 [String]$Root 61 : 設定するRootPathを指定します。 62 63 [Bool]返値 64 : 正常に完了したか 65#> 66 #ドライブの解除 67 $ErrorActionPreference = "silentlycontinue" 68 $null = switch ($(_Get_DriveInfo -Name $Name)) 69 { 70 {$_ -eq $null} { 71 return $true 72 break 73 } 74 {$_.Type -eq 'Hardware'} { 75 return $false 76 break 77 } 78 {$_.Type -eq 'NetWork'} { 79 #ネットワークドライブの割当解除 80 [bool]$Return = $(net use $($Name + ":") /delete /y) -as 'bool' 81 return $Return 82 break 83 } 84 {$_.Type -eq 'Phantom'} { 85 #仮想ドライブの解除 86 [bool]$Return = !(Subst $($Name + ":") /d) 87 break 88 } 89 } 90 $ErrorActionPreference = "continue" 91 92return $Return 93} 94 95 96 97function _Get_DriveInfo ([string]$Name) { 98[OutputType([psobject])] 99#引数で指定されたドライブの情報を返す# 100 [System.Management.Automation.PSDriveInfo]$Info = Get-PSDrive | Where-Object{$_.Name -eq $Name} 101 if($Info -eq $null) 102 { 103 return $null 104 } 105 $NetDriveRoot = $($(Get-WMIObject -query $("Select * From Win32_LogicalDisk Where DeviceID='" + $Name + ":' and DriveType = 4")).ProviderName) 106 if($NetDriveRoot -eq $null) 107 { 108 $SubstDrive = $(subst) | Where-Object{$_.substring(0,$_.indexof(':')) -eq $Name} 109 if ($SubstDrive -eq $null) 110 { 111 $DriveInfo = [ordered]@{Name = $Name ; Root = $Info.Root ; Type = "Hardware"} 112 } 113 else 114 { 115 $DriveInfo = [ordered]@{Name = $Name ; Root = $($SubstDrive -split '\:\\: => ')[1] ; Type = "Phantom"} 116 } 117 } 118 else 119 { 120 $DriveInfo = [ordered]@{Name = $Name ; Root = $NetDriveRoot ; Type = "NetWork"} 121 } 122 $Return = $DriveInfo | foreach{New-Object psobject -Property $_} 123return $Return 124} 125 126function _AuthorityValidation () { 127[OutputType([bool])] 128<# 129 管理者権限で実行されているか返す 130 131 [Bool]返値 132 : 管理者権限か 133#> 134 135 $Admin = $(([Security.Principal.WindowsPrincipal] ` 136 [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(` 137 [Security.Principal.WindowsBuiltInRole] "Administrator")) 138return $Admin 139 140} 141 142Function _ZoneDel($FineFullName){ 143<# 144 ファイルのZone情報を削除する 145 (インターネットから入手したフラグの削除) 146#> 147Remove-Item -Path $FineFullName -Stream *Zone* 148} 149 150function _Get_SPFoderPath([string]$Str_Folder) { 151<# 152 特殊フォルダのパス取得 153 154 'MyDocuments' 155 'MyMusic' 156 'MyPictures' 157 'MyVideos' 158 'Desktop' 159 'Fonts' 160 'SendTo' 161 'Startup' 162 'ApplicationData' 163 164#> 165 return [Environment]::GetFolderPath($Str_Folder) 166} 167
試したこと
全て 管理者権限 なのが悪いのかと思い
試しに管理者権限でISEを開き「System.ps1」を単体で開いて「F5」キーで実行した後
ISEのコンソールで直接_Set_Drive -Name "Z" -Root "\File-Server\Disk1"
を
実行してみたらZドライブのショートカットを叩かないとつながりませんでしたが
コマンドの実行自体は成功しました。
失敗したときの $(net use $($Name + ":") $Root)
の返り値を見てみたのですが
何も帰ってきてないようでした。
--追記-- 2018.10.11_9:55
関数側を変更して$(net use $($Name + ":") $Root)
の返り値等を受け取ろうとしていたのが悪かったようで$Block08 =
の箇所に直接$(net use $("Z" + ":") "\File-Server\Disk1")
を追加してみたところシステム エラー 58 が発生しました。
とエラーが帰ってきていることがわかりました。
調べたところWindows のサポートにてエラー 58がでる原因の一つとしてSMBv1 が無効になっていることが分かったので試にEnable-WindowsOptionalFeature -Online -FeatureName smb1protocolでSMBv1を有効にしてから試してみたのですがだめでした。
--追記--
ルータのファイアウォール設定で「NBTとMicrosoft-DSのルーティングを禁止する」
なんて項目があったので切ってみたのですがだめでした。
補足情報(FW/ツールのバージョンなど)
Win10 Home & Pro
Powershell Version = Default

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。