LoginSignup
kaoriiiii
@kaoriiiii

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

VBでの共有フォルダ接続について

解決したいこと

ボタンを押すと共有フォルダに接続されるコードをVBで書いているがうまく接続されない。

以下コード

Imports System.Runtime.InteropServices
Imports System.Security.Cryptography.X509Certificates

Public Class Form1

    "WNetAddConnection2関数をインポート(接続)
    Public Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" _
    (ByRef lpNetResource As NetResource, ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Integer) As Integer

    ' 接続リソースを定義
    Public Structure NetResource
        Public dwScope As Integer     
        Public dwType As Integer
        Public dwDisplayType As Integer
        Public dwUsage As Integer
        Public lpLocalName As String
        Public lpRemoteName As String
        Public lpComment As String
        Public lpProvider As String
    End Structure

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    '接続する
    Dim sharedFolderPath As String = "\\172.18.1.118\共有フォルダ" 
    Dim username As String = "username" ' ユーザー名を指定してください
    Dim password As String = "password" ' パスワードを指定してください

        Try
            Dim netResource As New NetResource()
            netResource.dwScope = 0 ' RESOURCE_GLOBALNET
            netResource.dwType = 1 ' RESOURCETYPE_DISK
            netResource.dwDisplayType = 0 ' RESOURCEDISPLAYTYPE_SHARE
            netResource.dwUsage = Nothing
            netResource.lpComment = Nothing
            netResource.lpLocalName = Nothing
            netResource.lpProvider = Nothing
            netResource.lpRemoteName = sharedFolderPath

            Dim result2 As Integer = WNetAddConnection2(netResource, password, username, 0)

            If result2 = 0 Then
                MessageBox.Show("共有フォルダに接続しました。", "成功")
            Else
                MessageBox.Show("エラーが発生しました。エラーコード: " & result2, "エラー")
            End If
            
            Catch ex As Exception MessageBox.Show("エラーが発生しました: " & ex.Message, "エラー")
        End Try
    End Sub
End Class

(結果)
以下のように接続できましたというメッセージは出るのですが、
image.png

以下の写真のようにネットワークに接続されません。
image.png

lpLocalName が NULL の場合は、ローカルデバイスのリダイレクトなしでネットワーク資源に接続する認識です。

lpLocalName をU:などのローカルドライブにすれば接続できます。

ネットワークに接続したいのですが、原因等ご教示いただけないでしょうか。

0

3Answer

net use \\172.18.1.118\共有フォルダ /user:username passwordコマンドをVB.netから投入してみたらどうでしょうか。

0

開発環境 (OS, Visual Studio のバージョン、ターゲットフレームワークなど) と、何を作っているか (WinForms?) を書いてください

0

こちらは公式のサンプルです。

dwFlagsにCONNECT_UPDATE_PROFILEを指定して、永続化する必要があるかも。

CONNECT_UPDATE_PROFILE
0x00000001
ネットワーク リソース接続を記憶する必要があります。
このビット フラグが設定されている場合、オペレーティング システムは、ユーザーがログオンしたときに接続の復元を自動的に試行します。
オペレーティング システムでは、ローカル デバイスをリダイレクトする正常な接続のみが記憶されます。 失敗した接続やデバイスレス接続は記憶されません。 ( lpLocalName メンバーが NULL であるか、空の文字列を指している場合、デバイスレス接続が発生します)。
このビット フラグがクリアされている場合、ユーザーがログオンしたときに、オペレーティング システムは接続の復元を試みません。

あと、どこを参考にしたかは知りませんが、ファイル名にUnicodeでしか扱えない文字があった時に困った事になるので、ANSI版のWinAPIや構造体を使用するのはやめたほうがいいです。VB.NETのサンプルだと、APIや構造体の宣言部はこちらが比較的まともそう。

0

Your answer might help someone💌