1

C# では、ネットワーク パスの可用性、認証に必要なものをテストしたいと思います。私は次の機能を使用しています:

    private bool TestDrive(string path,string userName,string domain, string password)
    {
        if (userName == "")
            return true;
        //else authentication needed
        try
        {
            using (new CImpersonator(userName, domain, password))
            {
                using (FileStream fs = File.Create(path+"\\1.txt"))
                { }
                File.Delete(path + "\\1.txt");
            }
            return true;
        }
        catch (Exception ex)
        {
            return false;
        }
    }
public CImpersonator(
        string userName,
        string domainName,
        string password,
        bool checkUserName = true)
    {
        //Check if user exists
        if (checkUserName && !CCheckUsername.UserExists(userName))
                return;

        this.ImpersonateValidUser(userName, domainName, password);
    }
private void ImpersonateValidUser(
        string userName,
        string domain,
        string password)
    {
        WindowsIdentity tempWindowsIdentity = null;
        IntPtr token = IntPtr.Zero;
        IntPtr tokenDuplicate = IntPtr.Zero;

        try
        {
            if (RevertToSelf())
            {
                if (LogonUser(
                    userName,
                    domain,
                    password,
                    LOGON32_LOGON_INTERACTIVE,
                    LOGON32_PROVIDER_DEFAULT,
                    ref token) != 0)
                {
                    if (DuplicateToken(token, (int)System.Management.ImpersonationLevel.Impersonate, ref tokenDuplicate) != 0)
                    {
                        tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
                        _impersonationContext = tempWindowsIdentity.Impersonate();
                        bool retVal;
                        TokPriv1Luid tp;
                        IntPtr hproc = (IntPtr)System.Diagnostics.Process.GetCurrentProcess().Id;
                        IntPtr htok = IntPtr.Zero;
                        retVal = OpenProcessToken(hproc, TOKEN_ALL_ACCESS, ref htok);
                        tp.Count = 1;
                        tp.Luid = 0;
                        tp.Attr = SE_PRIVILEGE_ENABLED;
                        retVal = LookupPrivilegeValue(null, SE_SYSTEMTIME_NAME, ref tp.Luid);
                        retVal = AdjustTokenPrivileges(token, false, ref tp, Marshal.SizeOf(typeof(TokPriv1Luid)), IntPtr.Zero, IntPtr.Zero);
                    }
                    else
                    {
                        throw new Win32Exception(Marshal.GetLastWin32Error());
                    }
                }
                else
                {
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                }
            }
            else
            {
                throw new Win32Exception(Marshal.GetLastWin32Error());
            }
        }
        finally
        {
            if (token != IntPtr.Zero)
            {
                CloseHandle(token);
            }
            if (tokenDuplicate != IntPtr.Zero)
            {
                CloseHandle(tokenDuplicate);
            }
        }
    }

問題は、これを別のドメインのネットワーク パスのテストに使用すると、TestDrive関数が false を返すことです。もちろん、ドメイン、ユーザー名、パスワードは問題ありません。ユーザー権限も問題ありません。

同じドメインでテストすると、関数がうまく機能するのは奇妙です。

すべてのアイデアをありがとう!

4

1 に答える 1

0

私は最初に次のことを試します:

Folder.Exists(String Path);

ただし、これは読み取りアクセス権を持つパスでのみ機能するため、ネットワーク パスが資格情報にマップされていない場合、このメソッドは false を返しますが、上記のメソッドを使用して false を返す場合は、ネットワーク パスをマップします (この質問は、それらの異なる資格情報を使用して、そのハウツーに回答します

そして、次を実行します。

Folder.Exists(String Path);

もう一度。その後、ネットワーク ドライブを再度切断できます。

于 2013-10-21T09:55:27.783 に答える