วิธีการรับรองความถูกต้องสำหรับ Active Directory โดยใช้การรับรองความถูกต้องของฟอร์มและ Visual .NET c#

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 316748 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
บทความนี้อ้างถึง Microsoft ต่อไปนี้.NET Framework ไลบรารีของคลา namespaces:
  • System.Text
  • System.DirectoryServices
  • System.Security.Principal
  • System.Web.Security
ขยายทั้งหมด | ยุบทั้งหมด

เนื้อหาบนหน้านี้

สรุป

บทความที่มีการทีละขั้นตอนนี้อธิบายวิธี ASP.NET โปรแกรมประยุกต์สามารถใช้การรับรองความถูกต้องของฟอร์มเพื่ออนุญาตให้ผู้ใช้การรับรองความถูกต้องสำหรับ Active Directory โดยใช้การ Lightweight ไดเรกทอรีการเข้าถึงโพรโทคอล (LDAP) ได้ หลังจากที่ผู้ใช้ที่ได้รับรองความถูกต้อง และการเปลี่ยนเส้นทาง คุณสามารถใช้การApplication_AuthenticateRequestวิธีการจัดเก็บแฟ้ม Global.asax เป็นGenericPrincipalวัตถุในนั้นHttpContext.Userคุณสมบัติ flows ตลอดการร้องขอ

สร้างโปรแกรมประยุกต์ ASP.NET เว็บใน Visual .NET c#

ทำตามขั้นตอนเหล่านี้เพื่อสร้างโปรแกรมประยุกต์เว็บ ASP.NET ที่ใหม่ที่ชื่อว่า FormsAuthAd ใน Visual .NET c#:
  1. เริ่ม Microsoft Visual Studio .NET
  2. ในการแฟ้ม:เมนู ให้ชี้ไปที่ใหม่แล้ว คลิกProject.
  3. คลิกแสดงโครงการ c#ภายใต้ชนิดโครงการแล้ว คลิกแอพลิเคชันเว็บ asp.netภายใต้แม่แบบ.
  4. ในการตำแหน่ง:กล่อง WebApplication1 ด้วยการแทนFormsAuthAd.
  5. คลิกตกลง.
  6. คลิกขวาอ้างอิง:โหนดใน Explorer โซลูชัน แล้วคลิกเพิ่มการอ้างอิง.
  7. ในการ.NETแท็บในนั้นเพิ่มการอ้างอิงกล่องโต้ตอบ คลิกSystem.DirectoryServices.dllคลิกเลือกแล้ว คลิกตกลง.

เขียนโค้ดการรับรองความถูกต้อง

ทำตามขั้นตอนเหล่านี้เพื่อสร้างแฟ้มการคลาใหม่ที่ชื่อ LdapAuthentication.cs:
  1. โซลูชัน Explorer คลิกขวาที่โหนโครงการ ชี้ไปที่addแล้ว คลิกเพิ่มรายการใหม่.
  2. คลิกคลาสภายใต้แม่แบบ.
  3. ประเภท:LdapAuthentication.csในการชื่อ:กล่อง แล้วคลิกOPEN.
  4. เปลี่ยนรหัสที่มีอยู่ในแฟ้ม LdapAuthentication.cs กับรหัสต่อไปนี้
    using System;
    using System.Text;
    using System.Collections;
    using System.DirectoryServices;
    
    namespace FormsAuth
    {	
      public class LdapAuthentication
      {
        private String _path;
        private String _filterAttribute;
    
        public LdapAuthentication(String path)
        {
          _path = path;
        }
    		
        public bool IsAuthenticated(String domain, String username, String pwd)
        {
          String domainAndUsername = domain + @"\" + username;
          DirectoryEntry entry = new DirectoryEntry(_path, domainAndUsername, pwd);
    			
          try
          {	//Bind to the native AdsObject to force authentication.			
             Object obj = entry.NativeObject;
    
    	DirectorySearcher search = new DirectorySearcher(entry);
    
    	search.Filter = "(SAMAccountName=" + username + ")";
    	search.PropertiesToLoad.Add("cn");
    	SearchResult result = search.FindOne();
    
    	if(null == result)
    	{
      	  return false;
    	}
    
    	//Update the new path to the user in the directory.
    	_path = result.Path;
    	_filterAttribute = (String)result.Properties["cn"][0];
          }
          catch (Exception ex)
          {
            throw new Exception("Error authenticating user. " + ex.Message);
          }
    
    	return true;
         }
    
         public String GetGroups()
         {
           DirectorySearcher search = new DirectorySearcher(_path);
           search.Filter = "(cn=" + _filterAttribute + ")";
           search.PropertiesToLoad.Add("memberOf");
           StringBuilder groupNames = new StringBuilder();
    
           try
           {
             SearchResult result = search.FindOne();
    
    	 int propertyCount = result.Properties["memberOf"].Count;
    
       	 String dn;
    	 int equalsIndex, commaIndex;
    				
    	 for(int propertyCounter = 0; propertyCounter < propertyCount; propertyCounter++)
    	 {
    	   dn = (String)result.Properties["memberOf"][propertyCounter];
    
        	   equalsIndex = dn.IndexOf("=", 1);
    	   commaIndex = dn.IndexOf(",", 1);
    	   if(-1 == equalsIndex)
    	   {
    	     return null;
         	   }
    
               groupNames.Append(dn.Substring((equalsIndex + 1), (commaIndex - equalsIndex) - 1));
    	   groupNames.Append("|");
    
        	 }
           }
           catch(Exception ex)
           {
             throw new Exception("Error obtaining group names. " + ex.Message);
           }			
           return groupNames.ToString();
         }
       }
    }
    					
รหัสการรับรองความถูกต้องยอมรับในโดเมน ชื่อผู้ใช้ รหัสผ่าน และเส้นทางไปยังแผนภูมิใน Active Directory รหัสนี้ใช้ตัวให้บริการ LDAP ไดเรกทอรี

รหัสใน Logon.aspx หน้าการเรียกไปLdapAuthentication.IsAuthenticatedวิธีการและผ่านไปในข้อมูลประจำตัวที่เก็บรวบรวมจากผู้ใช้ จาก นั้น คำDirectoryEntryวัตถุถูกสร้างขึ้น ด้วยเส้นทางไปยังแผนภูมิไดเรกทอรี ชื่อผู้ใช้ และรหัสผ่าน ชื่อผู้ใช้ต้องอยู่ในรูปแบบ "โดเมน\ชื่อ" กระบวนการDirectoryEntryวัตถุแล้วพยายามบังคับAdsObjectการผูก โดยได้รับการNativeObjectคุณสมบัติ ถ้านี่สำเร็จcnคุณลักษณะสำหรับผู้ใช้จะได้รับ โดยการสร้างเป็นDirectorySearcherวัตถุ และด้วยการกรองบนSAMAccountName. หลังจากที่ผู้ใช้ที่ได้รับรองความถูกต้องIsAuthenticatedวิธีการส่งคืนTrue.

เมื่อต้องการดูรายการของกลุ่มผู้ใช้ที่อยู่ เรียกรหัสนี้จะLdapAuthentication.GetGroupsวิธีการ กระบวนการLdapAuthentication.GetGroupsวิธีการขอรับรายการของกลุ่มรักษาความปลอดภัยและการแจกจ่ายที่ผู้ใช้อยู่ โดยการสร้างเป็นDirectorySearcherวัตถุ และการกรองข้อมูลตามด้วยmemberOfแอตทริบิวต์ วิธีนี้ส่งกลับรายการของกลุ่มที่คั่น ด้วย pipes (|)

สังเกตว่า การLdapAuthentication.GetGroupsวิธี manipulates และ truncates สตริงการ ซึ่งช่วยลดความยาวของสายอักขระที่ถูกเก็บอยู่ในคุกกี้การรับรองความถูกต้อง ถ้าสายอักขระไม่ถูกตัดทอน รูปแบบของแต่ละกลุ่มปรากฏขึ้นเป็นดังนี้
CN=...,...,DC=domain,DC=com
				
วิธีนี้สามารถสร้างสตริงที่มีความยาวมาก ถ้าความยาวของข้อความนี้มีค่ามากกว่าความยาวของคุกกี้ เบราว์เซอร์อาจไม่ยอมรับคุกกี้การรับรองความถูกต้อง และคุณจะสามารถเปลี่ยนเส้นทางไปยังหน้าการเข้าสู่ระบบ อย่างไรก็ตาม ถ้าคุณอยู่ในสภาพแวดล้อมแบบ multi-domain คุณอาจต้องให้ชื่อโดเมน ด้วยชื่อของกลุ่มได้เนื่องจากกลุ่มในโดเมนต่าง ๆ สามารถทำให้เกิดการเรียกใช้ชื่อของกลุ่มเดียวกัน คุณต้องเก็บชื่อโดเมนไปยังกลุ่มหนึ่งกลุ่มที่แยกความแตกต่างจากที่อื่น

เบราว์เซอร์ส่วนใหญ่จะสนับสนุนคุกกี้ไบต์ถึง 4096 ถ้าข้อความนี้อาจเป็นเกินความยาวของคุกกี้ คุณอาจต้องการเก็บข้อมูลกลุ่ม ในแคช ASP.NET วัตถุ หรือ ในฐานข้อมูล อีกวิธีหนึ่งคือ คุณอาจต้องการเข้ารหัสลับข้อมูลกลุ่ม และเก็บข้อมูลนี้ในเขตข้อมูลฟอร์มที่ซ่อนไว้

เขียนรหัส Global.asax

แสดงรหัสในแฟ้ม Global.asax ข้อApplication_AuthenticateRequestตัวจัดการเหตุการณ์ ตัวจัดการเหตุการณ์นี้ดึงข้อมูลคุกกี้การรับรองความถูกต้องจากนั้นContext.Request.Cookiesคอลเลกชัน decrypts คุกกี้ และดึงรายการของกลุ่มที่จะถูกเก็บไว้ในนั้นFormsAuthenticationTicket.UserDataคุณสมบัติ กลุ่มปรากฏในรายชื่อที่คั่นไปป์ที่สร้างขึ้นในหน้า Logon.aspx

รหัสแยกวิเคราะห์สตริงที่ในอาร์เรย์เป็นสตริงที่สร้างเป็นGenericPrincipalวัตถุ หลังจากGenericPrincipalวัตถุถูกสร้าง วางวัตถุนี้อยู่ในนั้นHttpContext.Userคุณสมบัติ
  1. คลิกขวาใน Explorer โซลูชันGlobal.asaxแล้ว คลิกรหัสของมุมมอง.
  2. เพิ่มรหัสต่อไปนี้ที่ด้านบนของแฟ้ม Global.asax.cs behind รหัส:
    using System.Web.Security;
    using System.Security.Principal;
    					
  3. ตัวจัดการเหตุการณ์ที่ว่างที่มีอยู่สำหรับแทนApplication_AuthenticateRequestมีรหัสต่อไปนี้
    void Application_AuthenticateRequest(Object sender, EventArgs e)
    {
      String cookieName = FormsAuthentication.FormsCookieName;
      HttpCookie authCookie = Context.Request.Cookies[cookieName];
    
      if(null == authCookie)
      {//There is no authentication cookie.
        return;
      }	
    		
      FormsAuthenticationTicket authTicket = null;
    	
      try
      {
        authTicket = FormsAuthentication.Decrypt(authCookie.Value);
      }
      catch(Exception ex)
      {
        //Write the exception to the Event Log.
        return;
      }
    	
      if(null == authTicket)
      {//Cookie failed to decrypt.
        return;		
      }		
    	
      //When the ticket was created, the UserData property was assigned a
      //pipe-delimited string of group names.
      String[] groups = authTicket.UserData.Split(new char[]{'|'});
    
      //Create an Identity.
      GenericIdentity id = new GenericIdentity(authTicket.Name, "LdapAuthentication");
    	
      //This principal flows throughout the request.
      GenericPrincipal principal = new GenericPrincipal(id, groups);
    
      Context.User = principal;
    	
    }
    					

ปรับเปลี่ยนแฟ้ม Web.config

ในส่วนนี้ คุณกำหนดค่านี้<forms></forms>กระบวนการ<authentication></authentication>และ<authorization></authorization>องค์ประกอบในแฟ้ม Web.config ด้วยการเปลี่ยนแปลงเหล่านี้ ผู้ใช้ authenticated เท่านั้นสามารถเข้าถึงแอพลิเคชัน และมีการเปลี่ยนเส้นทางไปยังเพ Logon.aspx unauthenticated การร้องขอ คุณสามารถปรับเปลี่ยนการตั้งค่าคอนฟิกนี้จะอนุญาตให้มีเฉพาะค่าที่แน่นอนผู้ใช้และกลุ่มการเข้าถึงแอพลิเคชัน

เปลี่ยนรหัสที่มีอยู่ในแฟ้ม Web.config กับรหัสต่อไปนี้
<?xml version="1.0" encoding="utf-8" ?>
<configuration>    
  <system.web>
    <authentication mode="Forms">
      <forms loginUrl="logon.aspx" name="adAuthCookie" timeout="10" path="/" >
      </forms>
    </authentication>	
    <authorization>	
      <deny users="?" />
      <allow users="*" />
    </authorization>	
    <identity impersonate="true" />
  </system.web>
</configuration>
				
คำประกาศนี้<identity impersonate="true"></identity>องค์ประกอบของการตั้งค่าคอนฟิก ซึ่งทำให้ ASP.NET เพื่อ impersonate แอคเคาท์มีการกำหนดค่าเป็นบัญชีที่ไม่ระบุชื่อจาก Microsoft ข้อมูลบริการทางอินเทอร์เน็ต (IIS) เป็นผลมาจากการกำหนดค่านี้ ร้องขอทั้งหมดไปยังโปรแกรมประยุกต์นี้ทำงานภายใต้บริบทการรักษาความปลอดภัยของบัญชีที่จัดโครงแบบ ผู้ใช้ให้ข้อมูลประจำตัวของการรับรองความถูกต้องสำหรับ Active Directory แต่บัญชีที่เข้าถึง Active Directory คือ บัญชีที่จัดโครงแบบ สำหรับข้อมูลเพิ่มเติม ให้ดูอ้างอิง:ส่วน

การตั้งค่าคอนฟิก IIS สำหรับการรับรองความถูกต้องแบบไม่ระบุชื่อ

เมื่อต้องการตั้งค่าคอนฟิก IIS สำหรับการรับรองความถูกต้องแบบไม่ระบุชื่อ ดำเนินการดังต่อไปนี้:
  1. ใน IIS ขยายโหนดคอมพิวเตอร์สำหรับเซิร์ฟเวอร์ของคุณ ขยายเว็บไซต์ขยายเว็บไซต์ที่มีค่าเริ่มต้นคลิกขวาFormsAuthAdแล้ว คลิกคุณสมบัติ.
  2. คลิกการแท็บการรักษาความปลอดภัยของไดเรกทอรีแล้ว คลิกแก้ไขภายใต้การเข้าถึงแบบไม่ระบุชื่อและการควบคุมการรับรองความถูกต้อง.
  3. ทำให้บัญชีที่ไม่ระบุชื่อสำหรับโปรแกรมประยุกต์ที่ใช้บัญชีที่มีสิทธิ์ในการ Active Directory
  4. คลิกเพื่อล้างกล่องกาเครื่องหมายรหัสอนุญาต IIS ไปยังตัวควบคุมผ่าน
  5. ในส่วน “เข้าถึงการรับรองความถูกต้อง ” ยกเลิกเลือกกล่องกาเครื่องหมาย “ Authentication Windows แบบรวม ”
  6. คลิกตกลง
  7. คลิกใช้
ค่าเริ่มต้น IUSR_computernameบัญชีไม่มีสิทธิ์ในการ Active Directory

สร้างเพ Logon.aspx

ทำตามขั้นตอนเหล่านี้เพื่อสร้างฟอร์มเว็บ ASP.NET ใหม่ซึ่งชื่อ Logon.aspx:
  1. โซลูชัน Explorer คลิกขวาที่โหนโครงการ ชี้ไปที่addแล้ว คลิกเพิ่มฟอร์มเว็บ.
  2. ประเภท:Logon.aspxในการชื่อ:กล่อง แล้วคลิกOPEN.
  3. คลิกขวาใน Explorer โซลูชันLogon.aspxแล้ว คลิกตัวออกแบบมุมมอง.
  4. คลิกการhtmlแท็บใน Designer
  5. เปลี่ยนรหัสที่มีอยู่กับรหัสต่อไปนี้
    <%@ Page language="c#" AutoEventWireup="true" %>
    <%@ Import Namespace="FormsAuth" %>
    <html>
      <body>	
        <form id="Login" method="post" runat="server">
          <asp:Label ID="Label1" Runat=server >Domain:</asp:Label>
          <asp:TextBox ID="txtDomain" Runat=server ></asp:TextBox><br>    
          <asp:Label ID="Label2" Runat=server >Username:</asp:Label>
          <asp:TextBox ID=txtUsername Runat=server ></asp:TextBox><br>
          <asp:Label ID="Label3" Runat=server >Password:</asp:Label>
          <asp:TextBox ID="txtPassword" Runat=server TextMode=Password></asp:TextBox><br>
          <asp:Button ID="btnLogin" Runat=server Text="Login" OnClick="Login_Click"></asp:Button><br>
          <asp:Label ID="errorLabel" Runat=server ForeColor=#ff3300></asp:Label><br>
          <asp:CheckBox ID=chkPersist Runat=server Text="Persist Cookie" />
        </form>	
      </body>
    </html>
    <script runat=server>
    void Login_Click(Object sender, EventArgs e)
    {
      String adPath = "LDAP://corp.com"; //Fully-qualified Domain Name
      LdapAuthentication adAuth = new LdapAuthentication(adPath);
      try
      {
        if(true == adAuth.IsAuthenticated(txtDomain.Text, txtUsername.Text, txtPassword.Text))
        {
          String groups = adAuth.GetGroups();
    
          //Create the ticket, and add the groups.
          bool isCookiePersistent = chkPersist.Checked;
          FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1,  txtUsername.Text,
    	DateTime.Now, DateTime.Now.AddMinutes(60), isCookiePersistent, groups);
    	
          //Encrypt the ticket.
          String encryptedTicket = FormsAuthentication.Encrypt(authTicket);
    		
          //Create a cookie, and then add the encrypted ticket to the cookie as data.
          HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
    
          if(true == isCookiePersistent)
    	authCookie.Expires = authTicket.Expiration;
    				
          //Add the cookie to the outgoing cookies collection.
          Response.Cookies.Add(authCookie);		
    
          //You can redirect now.
          Response.Redirect(FormsAuthentication.GetRedirectUrl(txtUsername.Text, false));
        }
        else
        {
          errorLabel.Text = "Authentication did not succeed. Check user name and password.";
        }
      }
      catch(Exception ex)
      {
        errorLabel.Text = "Error authenticating. " + ex.Message;
      }
    }
    </script>
  6. ปรับเปลี่ยนเส้นทางในหน้า Logon.aspx ให้ชี้ไปยังเซิร์ฟเวอร์ LDAP ไดเรกทอรีของคุณ
หน้า Logon.aspx มีหน้าที่การเก็บรวบรวมข้อมูลจากผู้ใช้และการเรียกวิธีในการLdapAuthenticationคลาสที่ หลังจากรหัส authenticates ผู้ใช้ และรายการของกลุ่มการขอรับ รหัสสร้างเป็นFormsAuthenticationTicketวัตถุ ในบัตรที่เข้ารหัสลับ เพิ่มบัตรที่เข้ารหัสลับคุกกี้ เพิ่มคุกกี้ไปยังHttpResponse.Cookiesคอลเลกชัน แล้ว เปลี่ยนเส้นทางการร้องขอไปยัง URL ที่ถูกร้องขอดั้งเดิม

ปรับเปลี่ยนเพ WebForm1.aspx

หน้า WebForm1.aspx คือ เพจที่มีการร้องขอตั้งแต่แรก เมื่อผู้ใช้ที่ร้องขอเพจนี้ การร้องขอถูกเปลี่ยนเส้นทางไปยัง Logon.aspx หน้า หลังจากที่ร้องขอจะรับรองความถูกต้อง คำขอถูกเปลี่ยนเส้นทางไปยังเพจการ WebForm1.aspx
  1. คลิกขวาใน Explorer โซลูชันWebForm1.aspxแล้ว คลิกตัวออกแบบมุมมอง.
  2. คลิกการhtmlแท็บใน Designer
  3. เปลี่ยนรหัสที่มีอยู่กับรหัสต่อไปนี้
    <%@ Page language="c#" AutoEventWireup="true" %>
    <%@ Import Namespace="System.Security.Principal" %>
    <html>
      <body>	
        <form id="Form1" method="post" runat="server">
          <asp:Label ID="lblName" Runat=server /><br>
          <asp:Label ID="lblAuthType" Runat=server />
        </form>	
      </body>
    </html>
    <script runat=server>
    void Page_Load(Object sender, EventArgs e)
    {
      lblName.Text = "Hello " + Context.User.Identity.Name + ".";
      lblAuthType.Text = "You were authenticated using " +   Context.User.Identity.AuthenticationType + ".";
    }
    </script>
    					
  4. บันทึกแฟ้มทั้งหมด และการคอมไพล์โครงการแล้ว
  5. การร้องขอเพ WebForm1.aspx ขอให้สังเกตว่า คุณจะเปลี่ยนเส้นเพื่อ Logon.aspx
  6. พิมพ์ข้อมูลประจำตัวการเข้าสู่ระบบ และจากนั้น คลิกส่ง. เมื่อคุณเปลี่ยนเส้นทางไปยัง WebForm1.aspx ขอให้สังเกตว่า ชื่อผู้ใช้ปรากฏขึ้น และที่LdapAuthenticationมีชนิดของการรับรองความถูกต้องสำหรับการContext.User.AuthenticationTypeคุณสมบัติ
หมายเหตุ:Microsoft แนะนำให้ คุณใช้ Secure Sockets Layer (SSL) เข้ารหัสลับเมื่อคุณใช้การรับรองความถูกต้องของฟอร์ม นี่คือเนื่องจากผู้ใช้ที่ระบุโดยยึดตามคุกกี้การรับรองความถูกต้อง และการเข้ารหัสลับ SSL บนเว็บไซต์โปรแกรมประยุกต์นี้ป้องกันทุกคน compromising คุกกี้การรับรองความถูกต้องและมีค่าข้อมูลอื่น ๆ ที่ไม่ถูกส่ง

ข้อมูลอ้างอิง

หากต้องการทราบข้อมูลเพิ่มเติม โปรดคลิกที่หมายเลขบทความต่อไปนี้เพื่อดูบทความใน Microsoft Knowledge Base::
306590ภาพรวมการรักษาความปลอดภัยของ asp.net
317012ตัวประมวลผลและการร้องขอใน ASP.NET
311495วิธีการใช้ตามบทบาทการรักษาความปลอดภัย ด้วยใช้แบบฟอร์มการรับรองความถูกต้องในโปรแกรมประยุกต์ ASP.NET ของคุณ โดยใช้ Visual .NET c#
313091วิธีการสร้างคีย์ โดยใช้ Visual Basic .NET สำหรับใช้ในการรับรองความถูกต้องของฟอร์ม
313116แบบฟอร์มการร้องขอการรับรองความถูกต้องไม่นำไปยังเพจการ loginUrl

คุณสมบัติ

หมายเลขบทความ (Article ID): 316748 - รีวิวครั้งสุดท้าย: 13 มกราคม 2554 - Revision: 5.0
ใช้กับ
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
Keywords: 
kbconfig kbcookie kbhowtomaster kbsecurity kbwebforms kbmt KB316748 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:316748

ให้ข้อเสนอแนะ

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com