通过用户名和密码访问域中的目录

时间:2017-07-13 07:54:32

标签: c# getdirectories

我使用visual studio 2015在c#中开发了一个应用程序,它通常将一些文件从一个目录(源)复制到另一个目录。 我的问题是源路径是域中的另一台计算机。我希望能够访问该目录并获取我的文件,用户使用域名,用户名和密码来源计算机。 我已经看到了一些解决方案,但我无法了解他们如何访问另一台计算机。 我曾经使用目录获取我的文件。 GetDirectories(路径),我现在使用它太深,无法将其改为平滑。 谢谢你帮我解决了我的问题,我现在真的被阻止了几天。



string[] folder1;
string[] folder2;
folder1 = Directory.GetDirectories(path);
foreach (string fld1 in folder1)
{
    folder2 = Directory.GetDirectories(fld);
    foreach(string fld2 in folder2)
    {
        for(int i = 0; i < MyList.Count(); i++)
        {
            if(fld2.Contains("nok") || fld2.Contains("Nok"))
                LNok = Directory.GetFiles(fld2, picList[i]);
            else
                Lok = Directory.GetFiles(fld2, picList[i]);
        }
    }
}
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:2)

由于System.IO.FileSystem.IO.Directory方法不支持传递凭据,因此首选解决方案是模拟授权用户帐户。这需要使用pInvoke从advapi32.dll和kernel32.dll导入两个方法:

//Impersonation functionality
[DllImport("advapi32.dll", SetLastError = true)]
private static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

//Disconnection after file operations
[DllImport("kernel32.dll")]
private static extern Boolean CloseHandle(IntPtr hObject);

以下代码使用这些方法创建WindowsImpersonationContext

const int LOGON_TYPE_NEW_CREDENTIALS = 9;
const int LOGON32_PROVIDER_WINNT50 = 3;

//User token that represents the authorized user account
IntPtr token = IntPtr.Zero;

bool result = LogonUser("username", "domainname", "password",  LOGON_TYPE_NEW_CREDENTIALS , LOGON32_PROVIDER_WINNT50, ref token);

if (result == true)
{
    //Use token to setup a WindowsImpersonationContext 
    using (WindowsImpersonationContext ctx = new WindowsIdentity(token).Impersonate())
    {
        //Your file operations
        string[] files = Directory.GetFiles(@"\\remotemachine\share\folder");

        //Release the context, and close user token
        ctx.Undo();
        CloseHandle(token);
    }
}

Here您可以找到LogonUser函数的MSDN文档