フォルダを共有にできるがアクセスできない


田中  2007-02-26 21:29:13  No: 135502

WinXP(ホスト/クライアント)、VB6、NetShareAddを利用してフォルダを共有しています。
フォルダのプロパティで確認すると、「ネットワーク上での共有とセキュリティ」の
・ネットワーク上でこのフォルダを共有する
・ネットワークユーザーによるファイルの変更を許可する
という所にチェックが入っています。
クライアントから確認すると、ネットワーク上にこのフォルダが見えるので、
共有はできているようです。しかし、アクセスできません。
これとは別に、手動で共有フォルダを作成した場合、上記と同じクライアント
からはこのフォルダにアクセスできます。
手動でフォルダを共有にした場合と、NetShareAddを使ってフォルダを共有した場合で
いったい何が違うのでしょうか?
アクセス権がないのでは?と思ったのですが、手動でフォルダを共有した場合には
アクセスができるので、何か設定が違っているのかな?と思っているのですが
よくわかりません。

設定はこんな具合にしています。

    serverName = StrConv("", vbUnicode)
    shareName = "test"
    shareInfo.shi2_netname = StrPtr(shareName)
    shareInfo.shi2_type = STYPE_DISKTREE
    remark = "test"
    shareInfo.shi2_remark = StrPtr(remark)
    shareInfo.shi2_max_uses = -1
    shareInfo.shi2_path = StrPtr("C:\\test")
    shareInfo.shi2_passwd = StrPtr("")
    res = NetShareAdd(serverName, 2, shareInfo, error)

ご存知の方、宜しくお願いします。


Blue  2007-02-26 23:46:43  No: 135503

一応NetShareAddの第一引数もStrPtrで指定するようにすべきでは?
(Declare宣言をByVal servername As Longにする)

>serverName = StrConv("", vbUnicode)
このように変換して、正しい変換は行われないでしょう。


田中  2007-02-27 00:09:06  No: 135504

NetShareAddの第一引数をStrPtrで指定できるよう修正し、
serverNameStr = ""
serverName = StrPtr(serverNameStr)
としてみましたが、結果は変わらずアクセスできませんでした。

通常、上記の処理だけでアクセスできるようになるのでしょうか?
shareInfo.shi2_passwd = StrPtr("")
とやっていますが、このパスワードもいまいちわかっておりません。

アクセス権を設定する際、IDとパスワードを設定するかと思いますが、
これと同じパスワードなのでしょうか??


魔界の仮面弁士  2007-02-27 02:51:40  No: 135505

> いったい何が違うのでしょうか?
より細かな設定の差異を確認するために、簡易共有を解除してみてください。
http://support.microsoft.com/kb/304040/ja

> serverName = StrPtr(serverNameStr)
第1引数を ByVal As Long にて定義しているなら、
APIに渡すべきは値は、長整数型の数値「0」なのでは。

> StrPtr("C:\\test")
なぜ C:\\test ではなく、C:\test なのでしょう?

> ご存知の方、宜しくお願いします。
API の宣言部も含めて、コード一式を提示してみてください。


田中  2007-02-27 04:31:05  No: 135506

これがソースです。

Private Declare Function NetShareAdd Lib "netapi32.dll" _
    (ByVal serverName As Long, ByVal level As Long, _
    buf As Any, parm_err As Long) As Long

Private Type SHARE_INFO_2
    shi2_netname      As Long
    shi2_type         As Long
    shi2_remark       As Long
    shi2_permissions  As Long
    shi2_max_uses     As Long
    shi2_current_uses As Long
    shi2_path         As Long
    shi2_passwd       As Long
End Type

'pathには"D:\Test\debug\"が渡ってきます。
Private Function Func(ByVal path As String) As Integer

    Dim serverName As Long
    Dim serverNameStr As String
    Dim shareName As String
    Dim remark As String
    Dim pswd As String
    Dim shareInfo As SHARE_INFO_2
    Dim error As Long
    Dim res As Long
    
    '"\"を削除する
    If Right(path, 1) = "\" Then
        path = Left(path, Len(path) - 1)
    End If

    'サーバ名
    serverNameStr = ""
    serverName = StrPtr(serverNameStr)

    '共有名
    shareName = FOLDER_SHARE_NAME
    shareInfo.shi2_netname = StrPtr(shareName)
    
    '共有タイプ
    shareInfo.shi2_type = STYPE_DISKTREE
    
    'コメント
    remark = ""
    shareInfo.shi2_remark = StrPtr(remark)
    
    '最大ユザー数 (-1=は無制限)
    shareInfo.shi2_max_uses = -1
    
    '共有フォルダパス
    shareInfo.shi2_path = StrPtr(path)
    
    'パスワード
    pswd = FOLDER_SHARE_PSWD
    shareInfo.shi2_passwd = StrPtr(pswd)

    shareInfo.shi2_permissions = 0
    shareInfo.shi2_current_uses = 0

    '共有設定
    res = NetShareAdd(serverName, 2, shareInfo, error)

    Func = res

End Function

現状、このようになっています。

>>簡易共有を解除してみてください。
>解除しました。

>> serverName = StrPtr(serverNameStr)
>第1引数を ByVal As Long にて定義しているなら、
>APIに渡すべきは値は、長整数型の数値「0」なのでは。
0とも思ったのですが、上記処理でもnullが返ってくる
のではないかと思ってこのようにしていました。
0にしてやってみます。

>> StrPtr("C:\\test")
>なぜ C:\\test ではなく、C:\test なのでしょう?
基は別の人が作ったもので、それに手を加えています。
元々が"\"になっていたので、VBはこのままでよいのだと
思っていました。(私もVBが初体験でして・・・)
他の言語のように"\\"とするべきですか?

・・・で、やってみた・・・ら、出来たんですが(ありがとうございます)
ちょっと待って下さい、ややこしくなってきました。

・簡易共有解除前
ユーザーを登録していないのにアクセスできていたのは、
どうもGuest(グループ)が有効になっていたので、
手動で作成、手動で共有したフォルダにはアクセスできていた。
ただ、NetShareAddを使って共有にしたフォルダにはアクセス
できなかった。(しかし、一度フォルダのプロパティで共有し直す
(チェックする所をOFF→ON)とアクセスできるようになる)

・簡易共有解除後
Guestグループを無効にしてNetShareAddを使ってみました。
フォルダは共有になったのですが、その共有フォルダにアクセス
可能なユーザーを登録しないといけなくなりました。
ユーザーを手動で追加し、グループをUsersにしたところ、
アクセスできるようになりました。

結果、解決のような気もするのですが、ユーザーの登録も
プログラムで行わないといけない状況になってしまったので、
この部分が現状確認できません。
なので、
・ユーザー登録
・ユーザーグループ設定
・フォルダにこのユーザーをアクセス許可設定する
というものを作らないとダメな状況って事ですか?
(?付けられても困りますよね)

・ユーザー登録
・ユーザーグループ設定
はサンプルのようなものがあたので、どうにかなりそうですが、
・フォルダにこのユーザーをアクセス許可設定する
は、どうやって設定するのでしょうか?
(質問が変わってしまった!?)

長くなってしまったので、まとめると、やりたい事は
1.ユーザー登録
2.ユーザーグループ設定
3.フォルダ共有
4.3で共有したフォルダにアクセスできるユーザーを設定
です。
ん?という所は、
・簡易共有の有効/無効で、上記1〜4を行う場合、
  処理も変わってしまうのか?
という所です。


魔界の仮面弁士  2007-02-27 08:44:39  No: 135507

> 0とも思ったのですが、上記処理でもnullが返ってくる
> のではないかと思ってこのようにしていました。
厳密には、(API にとっての)null とはならないでしょう。
  Dim S As String
  S = ""
  Debug.Print StrPtr(S)
  S = vbNullString
  Debug.Print StrPtr(S)
を実行してみれば、その違いがわかりますよね。

> 他の言語のように"\\"とするべきですか?
「他の言語」がどの言語なのか微妙ですが、VB では「\」は特殊文字では
ありませんので、連記する必要はありません。

VBの文字列指定で連記する必要がある記号は、「"」だけです。

<以下、無責任発言>

ドメインなのか、ワークグループなのかによって、利用可能な選択肢が
変わってくるかも。
# さらに XP 以外の OS (9x系/Vista)だと、また異なってきたりして。

とりあえず思いつくところでは、NetUserAdd などのネットワーク管理API群。
それ以外では、このあたりが参考になるかも知れないし、ならないかも知れない…。
http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/may06/hey0516.mspx
http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/jan06/hey0123.mspx
http://www.microsoft.com/japan/technet/scriptcenter/scripts/ad/users/manage/default.mspx


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加