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)
ご存知の方、宜しくお願いします。
一応NetShareAddの第一引数もStrPtrで指定するようにすべきでは?
(Declare宣言をByVal servername As Longにする)
>serverName = StrConv("", vbUnicode)
このように変換して、正しい変換は行われないでしょう。
NetShareAddの第一引数をStrPtrで指定できるよう修正し、
serverNameStr = ""
serverName = StrPtr(serverNameStr)
としてみましたが、結果は変わらずアクセスできませんでした。
通常、上記の処理だけでアクセスできるようになるのでしょうか?
shareInfo.shi2_passwd = StrPtr("")
とやっていますが、このパスワードもいまいちわかっておりません。
アクセス権を設定する際、IDとパスワードを設定するかと思いますが、
これと同じパスワードなのでしょうか??
> いったい何が違うのでしょうか?
より細かな設定の差異を確認するために、簡易共有を解除してみてください。
http://support.microsoft.com/kb/304040/ja
> serverName = StrPtr(serverNameStr)
第1引数を ByVal As Long にて定義しているなら、
APIに渡すべきは値は、長整数型の数値「0」なのでは。
> StrPtr("C:\\test")
なぜ C:\\test ではなく、C:\test なのでしょう?
> ご存知の方、宜しくお願いします。
API の宣言部も含めて、コード一式を提示してみてください。
これがソースです。
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を行う場合、
処理も変わってしまうのか?
という所です。
> 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
ツイート | ![]() |