2

ログインしてローカルドライブにファイルを書き込むことにより、Webサイトからいくつかのファイルを読み取ろうとしているC#を使用してASP.NETアプリケーションに取り組んでいます。

-を使用してデフォルトのクレデンシャルを読み取ることにより、Webサイトにログオンするためのネットワーククレデンシャルをすでに渡しました。

request.Proxy.Credentials = CredentialCache.DefaultCredentials;

ここで、場所にアクセスするためにいくつかの資格情報を必要とするサーバーディレクトリにファイルを保存したいと思います。

ウェブサイトへのログオンコード-

                string webUrl = "https://web.site.com/";

            string formParams = string.Format("user={0}&password={1}", username, password);

            WebRequest req = WebRequest.Create(webUrl);
            req.ContentType = "application/x-www-form-urlencoded";
            req.Method = "POST";
            req.Proxy.Credentials = CredentialCache.DefaultCredentials;
            byte[] bytes = Encoding.ASCII.GetBytes(formParams);
            req.ContentLength = bytes.Length;
            using (Stream os = req.GetRequestStream())
            {
                os.Write(bytes, 0, bytes.Length);
            }
            WebResponse resp = req.GetResponse();

            cookieHeader = resp.Headers["Set-cookie"];

そして場所は\\11.11.11.11\Folder\

その場所にアクセスするための資格情報を渡すにはどうすればよいですか?私はこれまで学んだimpersonationが、何も役に立たなかった。場所へのアクセスを許可する資格情報を持っています。しかし、C#コードを使用してこれを行うにはどうすればよいですか?

前もって感謝します :)

4

1 に答える 1

1

LogonUserこれにはAPIを使用できます。この関数を使用して、偽装することLogonUserを表すトークンを作成します。次に、トークンを使用してをWindowsIdentity作成し、IDを呼び出します。以下のすべてのコードは、偽装されたIDで実行されます。WindowsIdentityImpersonate

常にあなたUndoWindowsImpersonationContext

[DllImport("advapi32.dll", SetLastError=true)]
public static extern bool LogonUser(string lpszUsername, string lpszDomain, 
                                    string lpszPassword, int dwLogonType, 
                                    int dwLogonProvider, out IntPtr phToken);

[DllImport("advapi32.dll", SetLastError=true)]
public extern static bool DuplicateToken(
    IntPtr ExistingTokenHandle, int SECURITY_IMPERSONATION_LEVEL,
    out IntPtr DuplicateTokenHandle);

[DllImport("kernel32.dll", SetLastError=true)]
static extern bool CloseHandle(IntPtr hHandle);

const int LOGON32_LOGON_INTERACTIVE = 2;
const int LOGON32_PROVIDER_DEFAULT = 0;
IntPtr hToken;
IntPtr hTokenDuplicate;

if (LogonUser(username, domain, password,
              LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, out hToken))
{
    if (DuplicateToken(hToken, 2, out hTokenDuplicate))
    {
        WindowsIdentity windowsIdentity = new WindowsIdentity(hTokenDuplicate);
        WindowsImpersonationContext impersonationContext =
            windowsIdentity.Impersonate();
        try
        {
            // Access files ...
            // ...
        }
        finally
        {
            impersonationContext.Undo();   
            if (hToken != IntPtr.Zero) CloseHandle(hToken);
            if (hTokenDuplicate != IntPtr.Zero) CloseHandle(hTokenDuplicate);
        }
    }
}
于 2012-07-03T07:59:13.903 に答える