預設 FTP 用戶隔離設定 <使用者Isolation>
概觀
元素 <userIsolation>
用來在 FTP 月臺的特定區段中啟動或限制 FTP 用戶端。 視 元素中指定的 <userIsolation>
選項而定,伺服器管理員可以防止在共用伺服器環境中的用戶之間未經授權的存取,其中單一 FTP 網站會在多位用戶帳戶之間共用。
FTP 使用者隔離是在 IIS 6.0 中引進,但在 FTP 7.0 和 FTP 7.5 中已大幅更新。 所有先前的 FTP 用戶隔離功能仍可供回溯相容性使用,但用戶隔離模式現在可以使用下列選項:
模式 描述 無 在 FTP 7.0 和 FTP 7.5 中指定此模式,會將使用者隔離設定為一律啟動 FTP 月臺根目錄中的 FTP 用戶端。 (IIS 6.0.) 附注:如果他們有足夠的許可權,任何 FTP 使用者都可以存取該 FTP 網站內任何其他 FTP 用戶的內容。 StartInUsersDirectory 在 IIS 6.0 中,如果目錄與使用者帳戶的名稱相同,且使用者隔離已停用,FTP 用戶端就會在目錄中針對使用者名稱啟動。 在 FTP 7.0 和 FTP 7.5 中,仍可藉由指定模式的 StartInUsersDirectory 來達成此狀況。 注意:如果他們有足夠的許可權,任何 FTP 使用者都可以存取該 FTP 網站內任何其他 FTP 用戶的內容。 IsolateRootDirectoryOnly 在 IIS 6.0 中,如果您啟用使用者隔離,並建立實體目錄,讓使用者第一次登入伺服器時,就可以使用全域虛擬目錄。 如果您想要在多個 FTP 使用者之間共用內容,您可以建立全域虛擬目錄。 此選項仍可在 FTP 7.0 和 FTP 7.5 中使用,方法是指定模式的 IsolateRootDirectoryOnly 。 IsolateAllDirectories 在 FTP 7.0 和 FTP 7.5 中指定此模式時,FTP 用戶端會在第一次登入伺服器時,從符合其使用者帳戶名稱的目錄中啟動。 透過使用此模式,您可以為每個帳戶使用虛擬目錄;您不再需要建立實體目錄。 (IIS 6.0.) 中無法這樣做。不過,如果您使用此選項,就無法再使用全域虛擬目錄。 若要在多個 FTP 使用者之間共享資料夾,您必須為每個使用者建立全域路徑的虛擬目錄。 ActiveDirectory 在 FTP 7.0 和 FTP 7.5 中指定此模式時,FTP 服務會從其 Active Directory 設定中的每個使用者帳戶擷取使用者隔離設定;此模式的運作方式與 IIS 6.0 相同。 Custom 使用 FTP 7.5,您現在可以為使用者隔離模式指定 [自定義 ]。 此模式可讓您使用 FTP 擴充性,藉由建立自定義 FTP 提供者來提供自定義用戶隔離。
使用 IsolateRootDirectoryOnly 或 IsolateAllDirectories 模式進行使用者隔離時,實體或虛擬目錄路徑必須使用下列階層:
用戶帳戶類型 主目錄語法 匿名使用者 %FtpRoot%\LocalUser\Public 本機 Windows 使用者帳戶 (需要基本身份驗證) %FtpRoot%\LocalUser\%UserName% Windows 網域帳戶 (需要基本身份驗證) %FtpRoot%\%UserDomain%\%UserName% IIS 管理員或 ASP.NET 自定義驗證用戶帳戶 %FtpRoot%\LocalUser\%UserName%
相容性
版本 | 備註 |
---|---|
IIS 10.0 | 未在 IIS 10.0 中修改專案 <userIsolation> 。 |
IIS 8.5 | 未在 IIS 8.5 中修改專案 <userIsolation> 。 |
IIS 8.0 | 未在 IIS 8.0 中修改專案 <userIsolation> 。 |
IIS 7.5 | 元素 <userIsolation> 的 <ftpServer> 元素隨附為 IIS 7.5 的功能。 |
IIS 7.0 | 元素 <userIsolation> 的 <ftpServer> 元素是在 FTP 7.0 中引進,這是 IIS 7.0 的個別下載專案。 |
IIS 6.0 | N/A |
使用 Windows 7 和 Windows Server 2008 R2 時,FTP 7.5 服務隨附為 IIS 7.5 的功能,因此不再需要下載 FTP 服務。
設定
若要支援 Web 伺服器的 FTP 發佈,您必須安裝 FTP 服務。 若要這樣做,請使用下列步驟。
Windows Server 2012 或 Windows Server 2012 R2
在工作列上,按一下 [伺服器管理員]。
在 伺服器管理員 中,按兩下 [管理] 功能表,然後按兩下 [新增角色及功能]。
在 [ 新增角色及功能精 靈] 中,按 [ 下一步]。 選取安裝類型,然後按 [ 下一步]。 選取目的地伺服器,然後按 [ 下一步]。
在 [ 伺服器角色] 頁面上,展開 [ Web 伺服器 (IIS) ],然後選取 [ FTP 伺服器]。
注意
支援 ASP。FTP 服務的成員資格驗證或 IIS 管理員驗證,除了 FTP 服務之外,您還需要選取 [FTP 擴充性]。
.按 [下一步],然後在 [ 選取功能 ] 頁面上,再次按 [ 下一步 ]。
在 [確認安裝選項] 頁面上,按一下 [安裝]。
在 [結果] 頁面上,按一下 [關閉]。
Windows 8 或 Windows 8.1
在 [開始] 畫面上,將指標一路移至左下角,以滑鼠右鍵按兩下 [開始] 按鈕,然後按兩下 [控制台]。
在 控制台 中,按兩下 [程式和功能],然後按兩下 [開啟或關閉 Windows 功能]。
展開 [Internet Information Services],然後選取 [ FTP 伺服器]。
注意
支援 ASP。FTP 服務的成員資格驗證或 IIS 管理員驗證,您也必須選取 [FTP 擴充性]。
按一下 [確定]。
按一下 [關閉] 。
Windows Server 2008 R2
在任務欄上,按兩下 [開始],指向 [系統管理工具],然後按兩下 [伺服器管理員]。
在 [伺服器管理員 階層] 窗格中,展開 [角色],然後按兩下 [Web 伺服器] (IIS) 。
在 [ Web Server (IIS) ] 窗格中,捲動至 [ 角色服務 ] 區段,然後按兩下 [ 新增角色服務]。
在 [新增角色服務精靈] 的 [選取角色服務] 頁面上,展開 [FTP 伺服器]。
選取 [FTP 服務]。
注意
支援 ASP。FTP 服務的成員資格驗證或 IIS 管理員驗證,您也必須選取 [FTP 擴充性]。
按一下 [下一步]。
在 [確認安裝選項] 頁面上,按一下 [安裝]。
在 [結果] 頁面上,按一下 [關閉]。
Windows 7
在任務欄上,按兩下 [開始],然後按兩下 [控制台]。
在 控制台 中,按兩下 [程式和功能],然後按兩下 [開啟或關閉 Windows 功能]。
展開 [Internet Information Services],然後展開 [FTP 伺服器]。
選取 [FTP 服務]。
注意
支援 ASP。FTP 服務的成員資格驗證或 IIS 管理員驗證,您也必須選取 [FTP 擴充性]。
按一下 [確定]。
Windows Server 2008 或 Windows Vista
從下列 URL 下載安裝套件:
請遵循下列逐步解說中的指示來安裝 FTP 服務:
作法
如何隔離虛擬目錄中的使用者
(IIS) 管理員開啟 Internet Information Services:
如果您使用 Windows Server 2012 或 Windows Server 2012 R2:
- 在任務欄上,依序按兩下 [伺服器管理員]、[工具],然後按兩下 [Internet Information Services (IIS) 管理員]。
如果您使用 Windows 8 或 Windows 8.1:
- 按住 Windows 鍵,按字母 X,然後按兩下 [控制台]。
- 單擊 [ 系統管理工具],然後按兩下 [Internet Information Services] ([IIS) 管理員]。
如果您使用 Windows Server 2008 或 Windows Server 2008 R2:
- 在任務欄上,按兩下 [ 開始],指向 [ 系統管理工具],然後按兩下 [ Internet Information Services (IIS) 管理員]。
如果您使用 Windows Vista 或 Windows 7:
- 在任務欄上,按兩下 [開始],然後按兩下 [控制台]。
- 按兩下 [ 系統管理工具],然後按兩下 [Internet Information Services] ([IIS) 管理員]。
在 [ 連線 ] 窗格中,展開伺服器名稱、展開 [月臺] 節點,然後按兩下月臺的名稱。
在網站的 [ 首頁] 窗格中,按兩下 [FTP 用戶隔離]。
在 [FTP 使用者隔離] 頁面的 [隔離使用者] 下。將使用者限制為下列目錄:,選取 [ 用戶名稱目錄] (停用全域虛擬目錄) 。
在 [動作] 窗格中,按一下 [套用]。
如何使用 Active Directory 隔離使用者
(IIS) 管理員開啟 Internet Information Services:
如果您使用 Windows Server 2012 或 Windows Server 2012 R2:
- 在任務欄上,依序按兩下 [伺服器管理員]、[工具],然後按兩下 [Internet Information Services (IIS) 管理員]。
如果您使用 Windows 8 或 Windows 8.1:
- 按住 Windows 鍵,按字母 X,然後按兩下 [控制台]。
- 單擊 [ 系統管理工具],然後按兩下 [Internet Information Services] ([IIS) 管理員]。
如果您使用 Windows Server 2008 或 Windows Server 2008 R2:
- 在任務欄上,按兩下 [ 開始],指向 [ 系統管理工具],然後按兩下 [ Internet Information Services (IIS) 管理員]。
如果您使用 Windows Vista 或 Windows 7:
- 在任務欄上,按兩下 [開始],然後按兩下 [控制台]。
- 按兩下 [ 系統管理工具],然後按兩下 [Internet Information Services] ([IIS) 管理員]。
在 [ 連線 ] 窗格中,展開伺服器名稱、展開 [月臺] 節點,然後按兩下月臺的名稱。
在網站的 [ 首頁] 窗格中,按兩下 [FTP 用戶隔離]。
在 [FTP 使用者隔離] 頁面的 [隔離使用者] 下。將使用者限制為下列目錄:,選取 [Active Directory 中設定的 FTP 主目錄 ],然後按兩下 [ 設定]。
在 [ 設定認證 ] 對話框中,於 [ 使用者名稱和 密碼] 方塊中輸入使用者名稱和 密碼 。 再次在 [ 確認密碼 ] 方塊中輸入密碼,然後按兩下 [ 確定]。
在 [動作] 窗格中,按一下 [套用]。
For additional information about how to set up the Active Directory, see the "Isolate Users Using Active Directory Mode" section in the Hosting Multiple FTP Sites with FTP User Isolation (IIS 6.0) topic.
設定
屬性
屬性 | Description | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
mode |
選擇性列舉屬性。 指定用戶隔離模式。
None 。 |
子元素
元素 | Description |
---|---|
activeDirectory |
選擇性項目。 指定與 Active Directory 伺服器通訊的連線認證和逾時。 |
組態範例
下列範例顯示 <userIsolation>
FTP 月臺的 元素,該月臺會將 FTP 服務設定為使用 Active Directory 進行使用者隔離,並設定與 Active Directory 伺服器連線的認證。
<site name="ftp.example.com" id="5">
<application path="/">
<virtualDirectory path="/" physicalPath="c:\inetpub\www.example.com" />
</application>
<bindings>
<binding protocol="ftp" bindingInformation="*:21:" />
</bindings>
<ftpServer>
<userIsolation mode="ActiveDirectory">
<activeDirectory adUserName="MyUser"
adPassword="[enc:RsaProtectedConfigurationProvider:57686f6120447564652c2049495320526f636b73:enc]"
adCacheRefresh="00:02:00" />
</userIsolation>
<security>
<authentication>
<basicAuthentication enabled="true" />
<anonymousAuthentication enabled="false" />
</authentication>
</security>
</ftpServer>
</site>
範例程式碼
下列範例會設定 FTP 網站的 Active Directory 用戶隔離。
AppCmd.exe
appcmd.exe set config -section:system.applicationHost/sites /[name='ftp.example.com'].ftpServer.userIsolation.mode:"ActiveDirectory" /commit:apphost
appcmd.exe set config -section:system.applicationHost/sites /[name='ftp.example.com'].ftpServer.userIsolation.activeDirectory.adUserName:"MyUser" /[name='ftp.example.com'].ftpServer.userIsolation.activeDirectory.adPassword:"MyPassword" /[name='ftp.example.com'].ftpServer.userIsolation.activeDirectory.adCacheRefresh:"00:02:00" /commit:apphost
注意
當您使用 AppCmd.exe 設定這些設定時,請務必將 認可 參數 apphost
設定為 。 這會將組態設定認可至 ApplicationHost.config 檔案中適當的位置區段。
C#
using System;
using System.Text;
using Microsoft.Web.Administration;
internal static class Sample {
private static void Main() {
using(ServerManager serverManager = new ServerManager()) {
Configuration config = serverManager.GetApplicationHostConfiguration();
ConfigurationSection sitesSection = config.GetSection("system.applicationHost/sites");
ConfigurationElementCollection sitesCollection = sitesSection.GetCollection();
ConfigurationElement siteElement = FindElement(sitesCollection, "site", "name", @"ftp.example.com");
if (siteElement == null) throw new InvalidOperationException("Element not found!");
ConfigurationElement ftpServerElement = siteElement.GetChildElement("ftpServer");
ConfigurationElement userIsolationElement = ftpServerElement.GetChildElement("userIsolation");
userIsolationElement["mode"] = @"ActiveDirectory";
ConfigurationElement activeDirectoryElement = userIsolationElement.GetChildElement("activeDirectory");
activeDirectoryElement["adUserName"] = @"MyUser";
activeDirectoryElement["adPassword"] = @"MyPassword";
activeDirectoryElement["adCacheRefresh"] = TimeSpan.Parse("00:02:00");
serverManager.CommitChanges();
}
}
private static ConfigurationElement FindElement(ConfigurationElementCollection collection, string elementTagName, params string[] keyValues)
{
foreach (ConfigurationElement element in collection)
{
if (String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase))
{
bool matches = true;
for (int i = 0; i < keyValues.Length; i += 2)
{
object o = element.GetAttributeValue(keyValues[i]);
string value = null;
if (o != null)
{
value = o.ToString();
}
if (!String.Equals(value, keyValues[i + 1], StringComparison.OrdinalIgnoreCase))
{
matches = false;
break;
}
}
if (matches)
{
return element;
}
}
}
return null;
}
}
VB.NET
Imports System
Imports System.Text
Imports Microsoft.Web.Administration
Module Sample
Sub Main()
Dim serverManager As ServerManager = New ServerManager
Dim config As Configuration = serverManager.GetApplicationHostConfiguration
Dim sitesSection As ConfigurationSection = config.GetSection("system.applicationHost/sites")
Dim sitesCollection As ConfigurationElementCollection = sitesSection.GetCollection
Dim siteElement As ConfigurationElement = FindElement(sitesCollection, "site", "name", "ftp.example.com")
If (siteElement Is Nothing) Then
Throw New InvalidOperationException("Element not found!")
End If
Dim ftpServerElement As ConfigurationElement = siteElement.GetChildElement("ftpServer")
Dim userIsolationElement As ConfigurationElement = ftpServerElement.GetChildElement("userIsolation")
userIsolationElement("mode") = "ActiveDirectory"
Dim activeDirectoryElement As ConfigurationElement = userIsolationElement.GetChildElement("activeDirectory")
activeDirectoryElement("adUserName") = "MyUser"
activeDirectoryElement("adPassword") = "MyPassword"
activeDirectoryElement("adCacheRefresh") = TimeSpan.Parse("00:02:00")
serverManager.CommitChanges()
End Sub
Private Function FindElement(ByVal collection As ConfigurationElementCollection, ByVal elementTagName As String, ByVal ParamArray keyValues() As String) As ConfigurationElement
For Each element As ConfigurationElement In collection
If String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase) Then
Dim matches As Boolean = True
Dim i As Integer
For i = 0 To keyValues.Length - 1 Step 2
Dim o As Object = element.GetAttributeValue(keyValues(i))
Dim value As String = Nothing
If (Not (o) Is Nothing) Then
value = o.ToString
End If
If Not String.Equals(value, keyValues((i + 1)), StringComparison.OrdinalIgnoreCase) Then
matches = False
Exit For
End If
Next
If matches Then
Return element
End If
End If
Next
Return Nothing
End Function
End Module
JavaScript
var adminManager = new ActiveXObject('Microsoft.ApplicationHost.WritableAdminManager');
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST";
var sitesSection = adminManager.GetAdminSection("system.applicationHost/sites", "MACHINE/WEBROOT/APPHOST");
var sitesCollection = sitesSection.Collection;
var siteElementPos = FindElement(sitesCollection, "site", ["name", "ftp.example.com"]);
if (siteElementPos == -1) throw "Element not found!";
var siteElement = sitesCollection.Item[siteElementPos]);
var ftpServerElement = siteElement.ChildElements.Item("ftpServer");
var userIsolationElement = ftpServerElement.ChildElements.Item("userIsolation");
userIsolationElement.Properties.Item("mode").Value = "ActiveDirectory";
var activeDirectoryElement = userIsolationElement.ChildElements.Item("activeDirectory");
activeDirectoryElement.Properties.Item("adUserName").Value = "MyUser";
activeDirectoryElement.Properties.Item("adPassword").Value = "MyPassword";
activeDirectoryElement.Properties.Item("adCacheRefresh").Value = "00:02:00";
adminManager.CommitChanges();
function FindElement(collection, elementTagName, valuesToMatch) {
for (var i = 0; i < collection.Count; i++) {
var element = collection.Item(i);
if (element.Name == elementTagName) {
var matches = true;
for (var iVal = 0; iVal < valuesToMatch.length; iVal += 2) {
var property = element.GetPropertyByName(valuesToMatch[iVal]);
var value = property.Value;
if (value != null) {
value = value.toString();
}
if (value != valuesToMatch[iVal + 1]) {
matches = false;
break;
}
}
if (matches) {
return i;
}
}
}
return -1;
}
VBScript
Set adminManager = createObject("Microsoft.ApplicationHost.WritableAdminManager")
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST"
Set sitesSection = adminManager.GetAdminSection("system.applicationHost/sites", "MACHINE/WEBROOT/APPHOST")
Set sitesCollection = sitesSection.Collection
siteElementPos = FindElement(sitesCollection, "site", Array("name", "ftp.example.com"))
If siteElementPos = -1 Then
WScript.Echo "Element not found!"
WScript.Quit
End If
Set siteElement = sitesCollection.Item(siteElementPos)
Set ftpServerElement = siteElement.ChildElements.Item("ftpServer")
Set userIsolationElement = ftpServerElement.ChildElements.Item("userIsolation")
userIsolationElement.Properties.Item("mode").Value = "ActiveDirectory"
Set activeDirectoryElement = userIsolationElement.ChildElements.Item("activeDirectory")
activeDirectoryElement.Properties.Item("adUserName").Value = "MyUser"
activeDirectoryElement.Properties.Item("adPassword").Value = "MyPassword"
activeDirectoryElement.Properties.Item("adCacheRefresh").Value = "00:02:00"
adminManager.CommitChanges()
Function FindElement(collection, elementTagName, valuesToMatch)
For i = 0 To CInt(collection.Count) - 1
Set element = collection.Item(i)
If element.Name = elementTagName Then
matches = True
For iVal = 0 To UBound(valuesToMatch) Step 2
Set property = element.GetPropertyByName(valuesToMatch(iVal))
value = property.Value
If Not IsNull(value) Then
value = CStr(value)
End If
If Not value = CStr(valuesToMatch(iVal + 1)) Then
matches = False
Exit For
End If
Next
If matches Then
Exit For
End If
End If
Next
If matches Then
FindElement = i
Else
FindElement = -1
End If
End Function