Zugriff auf freigegebene Ordner auf anderen Servern über eine ASP.NET Core-Anwendung (Network Connected Program-Version)
Umgebung zur Betriebsüberprüfung
- Visuelles Studio
-
- Visual Studio 2022
- ASP.NET Kern
-
- 8 (Razor Pages, MVC)
- Windows-Server
-
- 2022 (ASP.NET Kernsystemanforderungen)
- 2019 (Bereitstellungsserver für freigegebene Ordner)
- IIS (IIS)
-
- 10.0
Betriebsumgebung
Wir haben es nicht in allen Fällen getestet, aber es sollte im Allgemeinen unter den folgenden Bedingungen funktionieren:
- Visuelles Studio
-
- Alles, was ein ASP.NET Core-Projekt entwickeln kann
- ASP.NET Kern
-
- Jede Version (MVC, Razor Pages, API)
- Windows-Server
-
- Windows Server 2008 oder höher
- IIS (IIS)
-
- 7.0 oder höher
Vorbedingung
- ASP.NET Core-Anwendungen sind für die Ausführung auf IIS vorgesehen.
- Da es Windows-APIs für die Authentifizierung verwendet, funktioniert es nicht unter Nicht-Windows.
Umwelt
Es wird in der folgenden Umgebung überprüft.
Verwendungszweck von | PCs und Servern |
---|---|
Windows 11 (lokal) | Eine Umgebung für die Entwicklung von Programmen. |
SV2022Test | Eine Umgebung, in der IIS und ASP.NET Core ausgeführt werden. Greifen Sie von hier aus auf den freigegebenen Ordner SV2019Test zu |
SV2019Test | Server mit freigegebenen Ordnern |
Darüber hinaus sind die verschiedenen Einstellungen wie folgt.
Wert des Parameternamens | |
---|---|
Zugriff auf Benutzername | SharedUser |
Name des freigegebenen Ordners | SharedFolder |
Erstellen eines Servers für freigegebene Ordner
Erstellen eines Benutzers
Erstellen Sie einen Benutzer für den Zugriff auf den gemeinsamen Ordner. In diesem Fall erstellen wir ein lokales Konto, aber wenn Sie es mit Servern und Konten in einer Domäne wie Active Directory zu tun haben, können Sie dieses auch verwenden.
Der Prozess der Erstellung eines Benutzers würde den Rahmen dieser Tipps sprengen, daher werden wir nicht zu sehr ins Detail gehen.
SharedUser
In diesem Fall erstellen wir es mit dem Namen .
Da dieser Benutzer den Bildschirm nicht bedient oder die Einstellungen ändert, kann das Passwort nicht geändert werden.
Wenn Sie die Standardeinstellung beibehalten, können Sie sich mit diesem Benutzer mit Remote Desktop usw. anmelden, also entfernen Sie bitte aus der Gruppe Users
.
Erstellen eines freigegebenen Ordners
Es spielt keine Rolle, wo Sie es erstellen. Dies liegt daran, dass sich andere Server nicht um den Speicherort des physischen Ordners kümmern.
In diesem Fall erstellen wir einen Ordner mit dem Namen direkt unter SharedFolder
dem Laufwerk C und geben ihn frei.
Öffnen Sie die Eigenschaften und konfigurieren Sie die Freigabeeinstellungen.
Der Name des freigegebenen Ordners sollte SharedFolder
lauten. Dieser Name ist für andere Server sichtbar.
Fügen Sie die Berechtigungen hinzu SharedUser
.
Everyone
Löschen Sie die vorhandene .
Bestätigen Sie mit der Berechtigung "Ändern".
Da wir nur Berechtigungen hinzugefügt haben, auf die von außen zugegriffen werden kann, werden wir sie intern SharedUser
so einstellen, dass sie in diesem Ordner ausgeführt werden können.
Bestätigen Sie mit der Berechtigung "Ändern".
Erstellen Sie eine Datei, um den Vorgang zu überprüfen. In diesem Programm wird die Kodierung in UFT-8 verarbeitet, also speichern Sie sie bitte in UTF-8.
Es ist in Ordnung, wenn Sie von einem anderen PC aus \\<サーバー名>\
auf den Explorer zugreifen, sich mit anmeldenSharedUser
und die Datei anzeigen können.
Erstellen eines Programms zum Lesen und Schreiben von Dateien aus einem freigegebenen Ordner aus einer ASP.NET Core-Anwendung
Der Herr/Frau-Vorgang besteht darin, auf die Schaltfläche zu klicken.
- Laden Sie Dateien in einen freigegebenen Ordner und zeigen Sie sie auf dem Bildschirm an
- Schreiben einer neuen Datei in einen freigegebenen Ordner
Prozess.
Razor Pages und MVC-Code sind Beispiele dafür, aber das Programm, das auf den freigegebenen Ordner zugreift, ist für beide gleich. Das Gleiche gilt für Web-APIs. Wenn überhaupt, sollte es auch im Client-Programm funktionieren.
Ein Prozess, der für die Dauer eines bestimmten Prozesses eine Verbindung zu einem Netzwerk herstellt
Erstellen Sie den folgenden Code an einer beliebigen Stelle in Ihrem Projekt. Der Klassenname ist SharedFolderAccessor
, aber der Name ist beliebig.
SharedFolderAccessor
Sie können auf den freigegebenen Ordner zugreifen, bis Sie eine Dispose
Instanz von .
using
Hier können Sie den Zeitraum angeben, in dem der Zugriff in einem expliziten Bereich möglich ist.
using System.ComponentModel;
using System.Net;
using System.Runtime.InteropServices;
<summary>
共有フォルダにユーザー名とパスワードでアクセスするためのクラスです。
using を使用すればそのスコープの間、共有フォルダにアクセスできます。
</summary>
public class SharedFolderAccessor : IDisposable
{
private readonly string _networkName;
<summary>
コンストラクタです。
</summary>
<param name="networkName">共有フォルダのあるサーバーを「\\<サーバー名>」形式で指定します。</param>
<param name="credentials">共有フォルダにアクセスするための資格情報です。</param>
<exception cref="Win32Exception"></exception>
public SharedFolderAccessor(string networkName, NetworkCredential credentials)
{
_networkName = networkName;
// 接続するネットワークの情報を設定
var netResource = new NetResource
{
Scope = ResourceScope.GlobalNetwork,
ResourceType = ResourceType.Disk,
DisplayType = ResourceDisplaytype.Share,
RemoteName = networkName,
};
// ドメインがある場合はドメイン名も指定、ない場合はユーザー名のみ
var userName = string.IsNullOrEmpty(credentials.Domain)
? credentials.UserName
: $@"{credentials.Domain}\{credentials.UserName}";
// 共有フォルダにユーザー名とパスワードで接続
var result = WNetAddConnection2(netResource, credentials.Password, userName, 0);
if (result != 0)
{
throw new Win32Exception(result, $"共有フォルダに接続できませんでした。(エラーコード:{result})");
}
// 正常に接続できれば WNetCancelConnection2 を呼び出すまではプログラムで共有フォルダにアクセス可能
}
~SharedFolderAccessor()
{
// Dispose を呼び忘れたときの保険
WNetCancelConnection2(_networkName, 0, true);
}
public void Dispose()
{
WNetCancelConnection2(_networkName, 0, true);
GC.SuppressFinalize(this); // Dispose を明示的に呼んだ場合はデストラクタの処理は不要
}
<summary>
ネットワーク リソースへの接続を確立し、ローカル デバイスをネットワーク リソースにリダイレクトできます。
</summary>
<param name="netResource">ネットワーク リソース、ローカル デバイス、ネットワーク リソース プロバイダーに関する情報など。</param>
<param name="password">ネットワーク接続の作成に使用するパスワード。</param>
<param name="username">接続を確立するためのユーザー名。</param>
<param name="flags">接続オプションのセット。</param>
<returns></returns>
[DllImport("mpr.dll")]
private static extern int WNetAddConnection2(NetResource netResource, string password, string username, int flags);
<summary>
既存のネットワーク接続を取り消します。
</summary>
<param name="name">リダイレクトされたローカル デバイスまたは切断するリモート ネットワーク リソースの名前。</param>
<param name="flags">接続の種類。</param>
<param name="force">接続に開いているファイルまたはジョブがある場合に切断を行う必要があるかどうか。</param>
<returns></returns>
[DllImport("mpr.dll")]
private static extern int WNetCancelConnection2(string name, int flags, bool force);
<summary>
NETRESOURCE 構造体を定義しています。
</summary>
[StructLayout(LayoutKind.Sequential)]
private class NetResource
{
public ResourceScope Scope;
public ResourceType ResourceType;
public ResourceDisplaytype DisplayType;
public int Usage;
public string LocalName = "";
public string RemoteName = "";
public string Comment = "";
public string Provider = "";
}
<summary>
ネットワークリソースのスコープ。
</summary>
private enum ResourceScope : int
{
<summary>ネットワークリソースへの現在の接続。</summary>
Connected = 1,
<summary>すべてのネットワークリソース。</summary>
GlobalNetwork = 2,
Remembered = 3,
Recent = 4,
<summary>ユーザーの現在および既定のネットワークコンテキストに関連付けられているネットワークリソース。</summary>
Context = 5,
};
<summary>
リソースの種類。
</summary>
private enum ResourceType : int
{
<summary>印刷リソースとディスクリソースの両方のコンテナー、または印刷またはディスク以外のリソースなど。</summary>
Any = 0,
<summary>共有ディスクボリューム。</summary>
Disk = 1,
<summary>共有プリンター。</summary>
Print = 2,
Reserved = 8,
}
<summary>
ユーザーインターフェイスで使用する必要がある表示の種類。
</summary>
private enum ResourceDisplaytype : int
{
<summary>リソースの種類を指定しないネットワークプロバイダーによって使用されます。</summary>
Generic = 0x0,
<summary>サーバーのコレクション。</summary>
Domain = 0x01,
<summary>サーバー。</summary>
Server = 0x02,
<summary>共有ポイント。</summary>
Share = 0x03,
File = 0x04,
Group = 0x05,
<summary>ネットワークプロバイダー。</summary>
Network = 0x06,
Root = 0x07,
Shareadmin = 0x08,
<summary>ディレクトリ。</summary>
Directory = 0x09,
Tree = 0x0a,
Ndscontainer = 0x0b,
}
}
Da es die Win32-APIs und WNetAddConnection2
WNetCancelConnection2
verwendet, funktioniert es nur in der Windows-Umgebung.
Ich habe vorerst einen Kommentar, aber wenn Sie mehr wissen möchten, schauen Sie bitte im Internet nach.
Zusätzlich zu freigegebenen Ordnern können Sie auch Vorgänge ausführen, um auf Netzwerkressourcen zuzugreifen.
Es ist einfach zu bedienen, und wenn Sie Folgendes schreiben, können Sie using
während des Bereichs auf den freigegebenen Ordner zugreifen.
using (new SharedFolderAccessor($@"\\{serverName}", credentials))
{
// この間は共有フォルダにアクセスできる
}
In Wirklichkeit WNetCancelConnection2
wird die Verbindung jedoch nicht sofort zum Zeitpunkt des Anrufs getrennt, sodass using
Sie auch nach dem Bereich auf den freigegebenen Ordner zugreifen können.
Testen von Code mit SharedFolderAccessor
Da der Zugriff auf den freigegebenen Ordner nicht vom Framework abhängt, erstellen wir eine gemeinsame Testmethode, die Dateien liest und schreibt. Pazor Pages und MVC sollten gleich heißen.
Der Inhalt ist ein Prozess, der den an das Argument übergebenen Text in den freigegebenen Ordner schreibt, die Textdatei liest, die sich bereits im freigegebenen Ordner befindet, und den Text zurückgibt.
using System.Net;
public static class Util
{
public static string ReadAndWrite(string text)
{
var serverName = "ServerName";
var folderName = "SharedFolder";
var inputFileName = "Input.txt";
var outputFileName = "Output.txt";
var username = "SharedUser";
var password = "password";
var credentials = new NetworkCredential(username, password);
using (new SharedFolderAccessor($@"\\{serverName}", credentials))
{
// ファイルの書き出し
System.IO.File.WriteAllText(Path.Combine($@"\\{serverName}\{folderName}", outputFileName), text);
// ファイルの読み込み
return System.IO.File.ReadAllText(Path.Combine($@"\\{serverName}\{folderName}", inputFileName));
}
}
}
Rasierer Seiten
In Razor Pages platzieren wir eine Schaltfläche in Index.cshtml, klicken darauf, führen den Testcode aus und zeigen die Ergebnisse auf dem Bildschirm an. In einigen Fällen ist der freigegebene Ordner möglicherweise nicht zugänglich, sodass er in einen try-catch eingeschlossen ist.
Index.cshtml.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace SharedFolderAccessRazorPages.Pages
{
public class IndexModel : PageModel
{
private readonly ILogger<IndexModel> _logger;
public string Message { get; set; } = "";
public IndexModel(ILogger<IndexModel> logger)
{
_logger = logger;
}
public void OnPost()
{
try
{
Message = Util.ReadAndWrite($"プログラムからの書き込み ({DateTime.Now})");
}
catch (Exception ex)
{
Message = ex.ToString();
}
}
}
}
Index.cshtml
@page
@model IndexModel
@{
ViewData["Title"] = "Home page";
}
<div class="text-center">
<h1 class="display-4">Welcome</h1>
<p>Learn about <a href="https://learn.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>
@* ここから追加 *@
<form method="post">
<button type="submit">サブミット</button>
</form>
<div>
@Model.Message
</div>
@* ここまで追加 *@
MVC
Ähnlich wird im Fall von MVC eine Schaltfläche in platziert, Index.cshtml
und wenn sie angeklickt wird, ruft sie den Testcode des freigegebenen Ordners auf.
Controller/HomeController.cs
// 省略
namespace SharedFolderAccessMvc.Controllers
{
public class HomeController : Controller
{
// 省略
public IActionResult Index()
{
return View();
}
// ここから追加
[HttpPost]
public IActionResult Index(string dummy)
{
try
{
ViewData["Message"] = Util.ReadAndWrite($"プログラムからの書き込み ({DateTime.Now})");
}
catch (Exception ex)
{
ViewData["Message"] = ex.ToString();
}
return View();
}
// ここまで追加
public IActionResult Privacy()
{
return View();
}
// 省略
}
}
Index.cshtml
@{
ViewData["Title"] = "Home Page";
}
<div class="text-center">
<h1 class="display-4">Welcome</h1>
<p>Learn about <a href="https://learn.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>
@* ここから追加 *@
<form method="post">
<button type="submit">サブミット</button>
</form>
<div>
@ViewData["Message"]
</div>
@* ここまで追加 *@
Betriebsbestätigung
Debuggen Sie und überprüfen Sie, ob Sie erfolgreich auf den freigegebenen Ordner zugreifen können.
Erstellen eines Anwendungsservers
Da wir bestätigt haben, dass durch Ausführen des Programms auf den freigegebenen Ordner zugegriffen werden kann, ist der nächste Schritt nicht erforderlich. Wenn Sie den Vorgang auf dem IIS-Server überprüfen möchten, können Sie dies tun, indem Sie die folgenden Schritte ausführen.
Von hier aus ist es eine Ergänzung, daher werde ich es nicht zu detailliert erklären, sondern hauptsächlich das Bild erklären.
Installieren von IIS
Installieren Sie es standardmäßig über den Server-Manager. Ich werde nicht auf die Details des Verfahrens eingehen.
Es sind keine zusätzlichen Funktionen erforderlich.
Derzeit sind keine zusätzlichen IIS-Dienste erforderlich.
Installation des ASP.NET Core Runtime Hosting-Pakets
Da wir ASP.NET Core 8 verwenden, müssen wir die Runtime entsprechend installieren. Laden Sie es von der folgenden URL herunter:
Um ASP.NET Core in IIS auszuführen, benötigen Sie ein sogenanntes "Hosting-Bundle". Laden Sie das "Hosting Bundle" von der ASP.NET Core Runtime herunter.
Führen Sie es nach dem Herunterladen auf dem Server aus.
Folgen Sie dem Assistenten, um es zu installieren.
Veröffentlichen Sie Ihr Programm
Geben Sie das Programm, das Sie in IIS bereitstellen möchten, als Datei aus Visual Studio aus.
Ändern Sie es für Windows.
Veröffentlichen Sie, wenn Sie fertig sind.
Wenn Sie auf den Zielspeicherort klicken, können Sie den Ordner öffnen, in dem sich die veröffentlichte Datei befindet.
Sie müssen nicht alle mitbringen, aber wenn Sie sich nicht sicher sind, können Sie sie vorerst alle mitnehmen. An dieser Stelle müssen Sie nur noch sicherstellen, dass die Datei vorhanden ist.
Erstellen und Bereitstellen von Webanwendungen
Öffnen Sie in den Windows-Verwaltungstools den IIS-Manager (Internetinformationsdienste).
Wir werden eine Site erstellen, aber dieses Mal werden wir die "Standard-Website" verwenden, die von Anfang an vorhanden ist.
Klicken Sie bei ausgewählter Standardwebsite auf Explorer, um den Ordner zu öffnen. Kopieren Sie das veröffentlichte Programm hierher. Sie können die Originaldatei löschen.
Öffnen Sie die Seite über den IIS-Link, und prüfen Sie, ob der Bildschirm angezeigt wird. Sie können zuerst einen Webbrowser öffnen und die URL direkt eingeben.
Betriebsbestätigung
Klicken Sie auf die Schaltfläche, um zu überprüfen, ob es ohne Probleme funktioniert. Im obigen Fall wird vom Webserver aus darauf zugegriffen, aber da es sich um einen Webserver handelt, sollte es möglich sein, ihn von anderen PCs aus zu bedienen.