0

私のプログラムは、別のドメインにある可能性のある他のマシン上のフォルダーを読み書きする必要があります。そこで、System.Runtime.InteropServices を使用して共有フォルダーを追加しました。私のWindowsサービスのメインメニューでハードコードされたとき、これはうまくいきました。しかし、それ以来、何かがうまくいかず、それがコーディング エラーなのか設定エラーなのかわかりません。

  • 共有フォルダの範囲は? プログラムのスレッドが共有フォルダを追加した場合、ローカル マシン全体がそれを見ることができますか?
  • 追加された共有フォルダを表示する方法はありますか? または、フォルダがいつ追加されたかを確認する方法はありますか?

    [DllImport("NetApi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    internal static extern System.UInt32 NetUseAdd(string UncServerName, int Level, ref USE_INFO_2 Buf, out uint ParmError);
    
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    internal struct USE_INFO_2
    {
        internal LPWSTR ui2_local;
        internal LPWSTR ui2_remote;
        internal LPWSTR ui2_password;
        internal DWORD ui2_status;
        internal DWORD ui2_asg_type;
        internal DWORD ui2_refcount;
        internal DWORD ui2_usecount;
        internal LPWSTR ui2_username;
        internal LPWSTR ui2_domainname;
    }
    
    private void AddSharedFolder(string name, string domain, string username, string password)
    {
        if (name == null || domain == null || username == null || password == null)
            return;
    
        USE_INFO_2 useInfo = new USE_INFO_2();
        useInfo.ui2_remote = name;
        useInfo.ui2_password = password;
        useInfo.ui2_asg_type = 0;    //disk drive
        useInfo.ui2_usecount = 1;
        useInfo.ui2_username = username;
        useInfo.ui2_domainname = domain;
        uint paramErrorIndex;
        uint returnCode = NetUseAdd(String.Empty, 2, ref useInfo, out paramErrorIndex);
        if (returnCode != 0)
        {
            throw new Win32Exception((int)returnCode);
        }
    }
    
4

1 に答える 1

1

コンピューターの各スレッドは、特定のユーザー アカウントで実行されます。共有フォルダにはセキュリティ設定があります。つまり、ACL ベースのアクセス制御の対象となるため、アクセス許可を持つユーザーと持たないユーザーがいる場合があります。これは、プログラム内のスレッドが一部の共有フォルダーを「表示」できる可能性がある一方で、同じコンピューター内の他のスレッド (デスクトップを使用する対話型ユーザーを含む) がそれらのフォルダーを「表示」できない可能性があることを意味します。

要約すると、ほとんど仮定しないでください。

于 2011-01-14T12:27:36.200 に答える