最近、需要が、上記のコードは、複数のサーバーに展開する必要がありますが、サーバーは、ファイル、サービスのニーズをアップロードするサービスの一番上に展開されるように、直接、唯一のオープンポート80を介してローカルサーバ、WebサイトへのアクセスをアクセスすることはできませんSystem.IO.File.Copyを使用して直接法は、現在のコンテキストは、資格情報を使用して、アプリケーションプールの資格情報であるため、ユーザー名やパスワードは、失敗した要求されます場合は、上記の他のサーバへのアップロード後にファイルをコピーします。
この問題を回避するには、アナログログイン次いでSystem.IO.File.Copyメソッドを使用し、次のことにあるコア・コードです。
使用してシステムを。 使用にSystem.Collectionsを。 使用してSystem.Collections.Genericを。 使用してSystem.Dataを。 使用したSystem.Diagnosticsを。 使用してSystem.Runtime.InteropServicesを。 使用してSystem.Security.Principalを。 使用してSystem.Security.Permissionsを。 パブリック クラスのForm1 { [DLLIMPORT(" ADVAPI32.DLL "、SetLastError = 真)] パブリック 静的 にexternの INTのLogonUser(文字列 lpszUsername、ストリング lpszDomain、ストリングlpszPassword、int型 dwLogonType、int型 dwLogonProvider、REF のIntPtr phToken)。 プライベート のボイドのButton1 Click(System.Objectの送信者、System.EventArgs e)は { のIntPtr admin_token = デフォルト(のIntPtr)。 WindowsIdentity wid_current = WindowsIdentity.GetCurrent()。 WindowsIdentity wid_admin = nullを。 WIC WindowsImpersonationContext = nullを。 してみてください{ MessageBox.Show(" コピーファイルを... " ); もし(のLogonUser("リモート管理者名"、" リモートドメイン名"、" リモートユーザーパスワード"、9、0、REF!admin_token)= 0 ){ wid_admin = 新しいWindowsIdentity(admin_token)。 WIC = wid_admin.Impersonate()。 System.IO.File.Copy(" C:\\ right.bmp "、" \\\\ xxx.xxx.xxx.xxx \\ testnew \\ right.bmp "、真)。 MessageBox.Show(" コピーが成功しました" ); } 他{ MessageBox.Show(" コピー失敗" )。 } } キャッチ(のSystem.Exception SE){ int型 RET = Marshal.GetLastWin32Error()。 MessageBox.Show(ret.ToString()、" エラーコード:" + ret.ToString()); MessageBox.Show(se.Message)。 } 最後に{ 場合(WIC!= NULL ){ wic.Undo(); } } } }