共用方式為


預設 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 提供者來提供自定義用戶隔離。

使用 IsolateRootDirectoryOnlyIsolateAllDirectories 模式進行使用者隔離時,實體或虛擬目錄路徑必須使用下列階層:

用戶帳戶類型 主目錄語法
匿名使用者 %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

注意

FTP 7.0 和 FTP 7.5 服務為 IIS 7.0 隨附頻外,需要從下列 URL 下載並安裝模組:

https://www.iis.net/expand/FTP

使用 Windows 7 和 Windows Server 2008 R2 時,FTP 7.5 服務隨附為 IIS 7.5 的功能,因此不再需要下載 FTP 服務。

設定

若要支援 Web 伺服器的 FTP 發佈,您必須安裝 FTP 服務。 若要這樣做,請使用下列步驟。

Windows Server 2012 或 Windows Server 2012 R2

  1. 在工作列上,按一下 [伺服器管理員]

  2. 伺服器管理員 中,按兩下 [管理] 功能表,然後按兩下 [新增角色及功能]。

  3. 在 [ 新增角色及功能精 靈] 中,按 [ 下一步]。 選取安裝類型,然後按 [ 下一步]。 選取目的地伺服器,然後按 [ 下一步]。

  4. 在 [ 伺服器角色] 頁面上,展開 [ Web 伺服器 (IIS) ],然後選取 [ FTP 伺服器]。

    注意

    支援 ASP。FTP 服務的成員資格驗證或 IIS 管理員驗證,除了 FTP 服務之外,您還需要選取 [FTP 擴充性]。
    Windows Server 2012 或 2012 R2 角色列表的螢幕快照。 .

  5. [下一步],然後在 [ 選取功能 ] 頁面上,再次按 [ 下一步 ]。

  6. 在 [確認安裝選項] 頁面上,按一下 [安裝]

  7. 在 [結果] 頁面上,按一下 [關閉]

Windows 8 或 Windows 8.1

  1. 在 [開始] 畫面上,將指標一路移至左下角,以滑鼠右鍵按兩下 [開始] 按鈕,然後按兩下 [控制台]。

  2. 控制台 中,按兩下 [程式和功能],然後按兩下 [開啟或關閉 Windows 功能]。

  3. 展開 [Internet Information Services],然後選取 [ FTP 伺服器]。

    注意

    支援 ASP。FTP 服務的成員資格驗證或 IIS 管理員驗證,您也必須選取 [FTP 擴充性]。
    [Windows 8 或 8.1 Windows 功能] 對話框的螢幕快照。

  4. 按一下 [確定]。

  5. 按一下 [關閉] 。

Windows Server 2008 R2

  1. 在任務欄上,按兩下 [開始],指向 [系統管理工具],然後按兩下 [伺服器管理員]。

  2. [伺服器管理員 階層] 窗格中,展開 [角色],然後按兩下 [Web 伺服器] (IIS)

  3. 在 [ Web Server (IIS) ] 窗格中,捲動至 [ 角色服務 ] 區段,然後按兩下 [ 新增角色服務]。

  4. 在 [新增角色服務精靈] 的 [選取角色服務] 頁面上,展開 [FTP 伺服器]。

  5. 選取 [FTP 服務]。

    注意

    支援 ASP。FTP 服務的成員資格驗證或 IIS 管理員驗證,您也必須選取 [FTP 擴充性]。
    Windows Server 2008 R2 [新增角色服務] 視窗的螢幕快照。

  6. 按一下 [下一步]。

  7. 在 [確認安裝選項] 頁面上,按一下 [安裝]

  8. 在 [結果] 頁面上,按一下 [關閉]

Windows 7

  1. 在任務欄上,按兩下 [開始],然後按兩下 [控制台]。

  2. 控制台 中,按兩下 [程式和功能],然後按兩下 [開啟或關閉 Windows 功能]。

  3. 展開 [Internet Information Services],然後展開 [FTP 伺服器]。

  4. 選取 [FTP 服務]。

    注意

    支援 ASP。FTP 服務的成員資格驗證或 IIS 管理員驗證,您也必須選取 [FTP 擴充性]。
    [Windows 7 功能] 對話框的螢幕快照。

  5. 按一下 [確定]。

Windows Server 2008 或 Windows Vista

  1. 從下列 URL 下載安裝套件:

  2. 請遵循下列逐步解說中的指示來安裝 FTP 服務:

作法

如何隔離虛擬目錄中的使用者

  1. (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) 管理員]。
  2. 在 [ 連線 ] 窗格中,展開伺服器名稱、展開 [月臺] 節點,然後按兩下月臺的名稱。

  3. 在網站的 [ 首頁] 窗格中,按兩下 [FTP 用戶隔離]。
    顯示網站首頁的 [I I S 管理員] 視窗螢幕快照。已選取 F T P 使用者隔離圖示。

  4. [FTP 使用者隔離] 頁面的 [隔離使用者] 下。將使用者限制為下列目錄:,選取 [ 用戶名稱目錄] (停用全域虛擬目錄)
    顯示 F T P 使用者隔離視窗的 [I I S 管理員] 視窗螢幕快照。

  5. 在 [動作] 窗格中,按一下 [套用]


如何使用 Active Directory 隔離使用者

  1. (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) 管理員]。
  2. 在 [ 連線 ] 窗格中,展開伺服器名稱、展開 [月臺] 節點,然後按兩下月臺的名稱。

  3. 在網站的 [ 首頁] 窗格中,按兩下 [FTP 用戶隔離]。
    顯示主要窗格中網站 [首頁] 的 [I S 管理員] 視窗螢幕快照。已選取 F T P 使用者隔離圖示。

  4. [FTP 使用者隔離] 頁面的 [隔離使用者] 下。將使用者限制為下列目錄:,選取 [Active Directory 中設定的 FTP 主目錄 ],然後按兩下 [ 設定]。
    [I I S 管理員] 視窗的螢幕快照,其中顯示主要窗格中的 F T P 使用者隔離。

  5. 在 [ 設定認證 ] 對話框中,於 [ 使用者名稱和 密碼] 方塊中輸入使用者名稱和 密碼 。 再次在 [ 確認密碼 ] 方塊中輸入密碼,然後按兩下 [ 確定]。

  6. 在 [動作] 窗格中,按一下 [套用]

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 選擇性列舉屬性。

指定用戶隔離模式。
名稱 描述
StartInUsersDirectory 指定不應該使用使用者隔離,但如果使用者存在,請啟動使用者目錄中的會話。

數值為 0
IsolateRootDirectoryOnly

指定使用者隔離應該只隔離根目錄。 使用者的主目錄必須是實體目錄,而且仍然可以使用全域虛擬目錄。

數值為 1

ActiveDirectory 根據 Active Directory 設定隔離使用者。

數值為 2
IsolateAllDirectories

指定使用者隔離應該隔離所有目錄。 使用者的主目錄可以是實體目錄或虛擬目錄,但會忽略全域虛擬目錄;所有虛擬目錄都必須在每個使用者的主路徑下明確建立。

數值為 3

None 指定不應該使用用戶隔離。

數值為 4
Custom 指定自定義 FTP 提供者會實作用戶隔離。

數值為 5
預設值是 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