0

ここで簡単な質問です。c# .netでユーザー名とパスワードを使用して別のサーバーフォルダーへのアクセスを設定するにはどうすればよいですか?

他のサーバーのフォルダーにファイルをアップロードする次のコードがあります。どういうわけか、ユーザー名とパスワードを使用する必要があり、このフォルダーにしかアクセスできません。フォルダのアクセス ユーザー名とパスワードを設定するコードを知っている人はいますか?

   private void uploadFile()
   {

           DateTime dateTime = DateTime.Now;
           string sDate = dateTime.ToString("yyyyMMdd") + "_" + dateTime.ToString("fffffff");

           string fn = System.IO.Path.GetFileName(File1.PostedFile.FileName);

           string SaveLocation = Server.MapPath("document") + "\\" + sDate + "_" + fn;

           supportFileName = sDate + "_" + fn;

           try
           {
               File1.PostedFile.SaveAs(SaveLocation);
           }
           catch (Exception ex)
           {
               err.Text = "Error: " + ex.Message;
           }
   }
4

1 に答える 1

2

別のサーバーにアクセスし、ファイルをアップロードします。まず、このユーザー アカウントに正しい権限を付与し、このアカウントを偽装する必要があります。

プログラミング コンテキストでの「偽装」という用語は、アプリケーションを最初に起動したユーザーとは別のユーザー コンテキストでコードを実行する手法を指します。つまり、ユーザー コンテキストは、アプリケーションの実行中に 1 回または複数回一時的に変更されます。

ここに 2 つの記事があります。サンプル コードを使用して、お役に立てれば幸いです。

http://www.codeproject.com/Articles/4051/Windows-Impersonation-using-C

http://www.codeproject.com/Articles/10090/A-small-C-Class-for-impersonating-a-User

    using ( new Impersonator( "myUsername", "myDomainname", "myPassword" ) )
{
   ...

   <code that executes under the new context>

   ...
}





 public WindowsImpersonationContext 
    ImpersonateUser(string sUsername, string sDomain, string sPassword)
{
    // initialize tokens
    IntPtr pExistingTokenHandle = new IntPtr(0);
    IntPtr pDuplicateTokenHandle = new IntPtr(0);
    pExistingTokenHandle = IntPtr.Zero;
    pDuplicateTokenHandle = IntPtr.Zero;

    // if domain name was blank, assume local machine
    if (sDomain == "")
        sDomain = System.Environment.MachineName;

    try
    {
        string sResult = null;

        const int LOGON32_PROVIDER_DEFAULT = 0;

        // create token
        const int LOGON32_LOGON_INTERACTIVE = 2;
        //const int SecurityImpersonation = 2;

        // get handle to token
        bool bImpersonated = LogonUser(sUsername, sDomain, sPassword, 
            LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, 
                ref pExistingTokenHandle);

        // did impersonation fail?
        if (false == bImpersonated)
        {
            int nErrorCode = Marshal.GetLastWin32Error();
            sResult = "LogonUser() failed with error code: " + 
                nErrorCode + "\r\n";

            // show the reason why LogonUser failed
            MessageBox.Show(this, sResult, "Error", 
                MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        // Get identity before impersonation
        sResult += "Before impersonation: " + 
            WindowsIdentity.GetCurrent().Name + "\r\n";

        bool bRetVal = DuplicateToken(pExistingTokenHandle, 
            (int)SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation, 
                ref pDuplicateTokenHandle);

        // did DuplicateToken fail?
        if (false == bRetVal)
        {
            int nErrorCode = Marshal.GetLastWin32Error();
            // close existing handle
            CloseHandle(pExistingTokenHandle); 
            sResult += "DuplicateToken() failed with error code: " 
                + nErrorCode + "\r\n";

            // show the reason why DuplicateToken failed
            MessageBox.Show(this, sResult, "Error", 
                MessageBoxButtons.OK, MessageBoxIcon.Error);
            return null;
        }
        else
        {
            // create new identity using new primary token
            WindowsIdentity newId = new WindowsIdentity
                                        (pDuplicateTokenHandle);
            WindowsImpersonationContext impersonatedUser = 
                                        newId.Impersonate();

            // check the identity after impersonation
            sResult += "After impersonation: " + 
                WindowsIdentity.GetCurrent().Name + "\r\n";

            MessageBox.Show(this, sResult, "Success", 
                MessageBoxButtons.OK, MessageBoxIcon.Information);
            return impersonatedUser;
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally
    {
        // close handle(s)
        if (pExistingTokenHandle != IntPtr.Zero)
            CloseHandle(pExistingTokenHandle);
        if (pDuplicateTokenHandle != IntPtr.Zero) 
            CloseHandle(pDuplicateTokenHandle);
    }
}
于 2013-05-02T05:01:59.563 に答える