質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

2回答

9212閲覧

PowerShellで リモート先のPC で ネットワークドライブを割り当てたい

kamikazelight

総合スコア305

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

1クリップ

投稿2018/10/10 08:09

編集2018/10/25 05:08

前提・実現したいこと

リモート接続 で ネットワークドライブを割り当てたいです。

発生している問題・エラーメッセージ

ネットワークドライブの割当等を行う関数が
リモート環境だと失敗する

--追記-- 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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

HKCU:\Network\へのレジストリ追加で出来ました。
ただ、再起動をしないと反映されないようで
そこだけ少し使い勝手がよくないですが...

私の環境下ではHKEY_USERS\S-1-5-21-258656542-2078436887-3708290455-1001\Network\
にも同様にネットワークドライブが見つかりましたが
HKCU:\Network\へ追加後の再起動でそちらにも反映されたので
一先ず触るのはやめました。

powershell

1if (-not $(Test-Path -Path "HKCU:\Network\<割り当てるドライブ文字>")) { 2 3 New-Item -Path "HKCU:\Network" -Name "<割り当てるドライブ文字>" -ItemType Directory 4 5 New-ItemProperty -Path "HKCU:\Network\<割り当てるドライブ文字>" -Name "RemotePath" -PropertyType "String" -Value "<ネットワークドライブのパス>" 6 New-ItemProperty -Path "HKCU:\Network\<割り当てるドライブ文字>" -Name "ProviderName" -PropertyType "String" -Value "Microsoft Windows Network" 7 8 New-ItemProperty -Path "HKCU:\Network\<割り当てるドライブ文字>" -Name "ConnectFlags" -PropertyType "DWORD" -Value 0 9 New-ItemProperty -Path "HKCU:\Network\<割り当てるドライブ文字>" -Name "ConnectionType" -PropertyType "DWORD" -Value 1 10 New-ItemProperty -Path "HKCU:\Network\<割り当てるドライブ文字>" -Name "DeferFlags" -PropertyType "DWORD" -Value 4 11 New-ItemProperty -Path "HKCU:\Network\<割り当てるドライブ文字>" -Name "ProviderType" -PropertyType "DWORD" -Value 0x20000 12 New-ItemProperty -Path "HKCU:\Network\<割り当てるドライブ文字>" -Name "UserName" -PropertyType "DWORD" -Value 0 13}

投稿2019/11/01 06:29

kamikazelight

総合スコア305

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

処理が混み入ってるので、まずは単純に
Enter-PSSessionで、リモートに入って

dos

1net use z: \File-Server[共有フォルダ名] [パスワード] /user:[ドメイン名][ユーザー名]

でエラー58が再現するのか確認してみてはいかがでしょうか?

投稿2018/10/18 13:55

Turkis_Mond

総合スコア94

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kamikazelight

2018/10/19 00:11

ありがとうございます。 確認してみます。
kamikazelight

2018/10/19 06:00

Enter-PSSession でnet use z: \File-Server\Disk1 とやってもエラー58が発生しました。 net use z: \File-Server[共有フォルダ名] [パスワード] /user:[ドメイン名][ユーザー名] の内容で実行すると net : システム エラー 1312 が発生しました。 + CategoryInfo : NotSpecified: (システム エラー 1312 が発生しました。:String) [], RemoteException + FullyQualifiedErrorId : NativeCommandError 指定されたログオン セッションは存在しません。そのセッションは既に終了している可能性があります。 っとエラーメッセージが表示されました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問