Đánh giá mã và phân tích bảo mật bằng Gemini CLI có các tiện ích

1. 📖 Giới thiệu

838a11ffed94b79e.png

Trong lớp học lập trình này, bạn sẽ tìm hiểu những kiến thức cơ bản về Gemini CLI và sử dụng tiện ích đánh giá mã cũng như phân tích bảo mật của Gemini CLI trong quy trình phát triển phần mềm của mình.

Kiến thức bạn sẽ học được

  • Cách thiết lập Gemini CLI
  • Cách định cấu hình Gemini CLI
  • Cách cài đặt tiện ích Gemini CLI
  • Cách sử dụng tiện ích Gemini CLI để đánh giá mã và phân tích bảo mật
  • Cách định cấu hình MCP cho Gemini CLI
  • Cách kiểm tra Gemini CLI trong CI/CD

Bạn cần có

  • Trình duyệt web Chrome
  • Tài khoản Gmail
  • Một Dự án trên đám mây đã bật tài khoản thanh toán

2. 🚀 Chuẩn bị thiết lập môi trường phát triển cho hội thảo

Bước 1: Chọn Dự án đang hoạt động trong Cloud Console

Trong Google Cloud Console, trên trang chọn dự án, hãy chọn hoặc tạo một dự án trên Google Cloud (xem phần trên cùng bên trái của bảng điều khiển)

6da543936f051b95.png

Nhấp vào biểu tượng đó, bạn sẽ thấy danh sách tất cả dự án của mình như ví dụ này:

3c3963e0fbb5ba4f.png

Giá trị được biểu thị bằng hộp màu đỏ là MÃ DỰ ÁN và giá trị này sẽ được dùng trong suốt hướng dẫn.

Đảm bảo bạn đã bật tính năng thanh toán cho dự án trên Cloud. Để kiểm tra, hãy nhấp vào biểu tượng trình đơn ☰ ở thanh trên cùng bên trái để xem Trình đơn điều hướng và tìm trình đơn Thanh toán

3291845833270d7f.png

ddf6f055d710f7a9.png

Nếu bạn thấy "Tài khoản thanh toán dùng thử của Google Cloud Platform" trong phần Thanh toán / Tổng quan ( phần trên cùng bên trái của bảng điều khiển đám mây), thì dự án của bạn đã sẵn sàng để sử dụng cho hướng dẫn này. Nếu không, hãy quay lại đầu hướng dẫn này và sử dụng tài khoản thanh toán dùng thử

45539d4ac57dd995.png

Bước 2: Làm quen với Cloud Shell

Bạn sẽ sử dụng Cloud Shell cho hầu hết các phần của hướng dẫn, hãy nhấp vào Kích hoạt Cloud Shell ở đầu Google Cloud Console. Nếu hệ thống nhắc bạn uỷ quyền, hãy nhấp vào Uỷ quyền

26f20e837ff06119.png

79b06cc89a99f840.png

Sau khi kết nối với Cloud Shell, chúng ta cần kiểm tra xem shell ( hoặc cửa sổ dòng lệnh) đã được xác thực bằng tài khoản của chúng ta hay chưa

gcloud auth list

Nếu bạn thấy gmail cá nhân của mình như ví dụ về đầu ra bên dưới, thì mọi thứ đều ổn

Credentialed Accounts

ACTIVE: *
ACCOUNT: alvinprayuda@gmail.com

To set the active account, run:
    $ gcloud config set account `ACCOUNT`

Nếu không, hãy thử làm mới trình duyệt và đảm bảo bạn nhấp vào Uỷ quyền khi được nhắc ( quá trình này có thể bị gián đoạn do sự cố kết nối)

Bước 3: Làm quen với Cloud Shell Editor và thiết lập thư mục làm việc của ứng dụng

Bây giờ, chúng ta có thể thiết lập trình chỉnh sửa mã để thực hiện một số việc liên quan đến mã hoá. Chúng ta sẽ sử dụng Trình chỉnh sửa Cloud Shell cho việc này

Chúng ta cần sao chép kho lưu trữ bản minh hoạ mà chúng ta sẽ tương tác. Chạy lệnh này trên cửa sổ dòng lệnh để sao chép kho lưu trữ và mở Trình chỉnh sửa Cloud Shell

git clone https://github.com/alphinside/gemini-cli-code-analysis-demo.git code-analysis-demo && cloudshell ws code-analysis-demo

Giờ đây, thư mục làm việc của Cloud Shell Editor sẽ có dạng như sau

3a72d901f5e78fcf.png

Tiếp theo, chúng ta cần đảm bảo rằng shell đã được định cấu hình thành PROJECT ID chính xác mà bạn có. Nếu thấy có giá trị bên trong ( ) trước biểu tượng $ trong thiết bị đầu cuối ( trong ảnh chụp màn hình bên dưới, giá trị là "your-workshop-project"), thì giá trị này cho biết dự án đã định cấu hình cho phiên shell đang hoạt động của bạn.

8785d925a094c260.png

Nếu giá trị được hiển thị đã chính xác, bạn có thể bỏ qua lệnh tiếp theo. Tuy nhiên, nếu không chính xác hoặc bị thiếu, hãy chạy lệnh sau

gcloud config set project <YOUR_PROJECT_ID>

Bây giờ, chúng ta có thể chuyển sang giai đoạn tiếp theo

3. 🚀 Thiết lập và định cấu hình

Nếu muốn cài đặt Gemini CLI trong hệ thống cục bộ, bạn có thể làm theo các bước sau:

  1. Đảm bảo hệ thống của bạn có Node phiên bản 20 trở lên
  2. Bật Gemini CLI bằng một trong hai cách sau:
  • Cài đặt dưới dạng gói toàn cục
# Install as an executor

npm install -g @google/gemini-cli

# then run it from terminal
gemini
  • Hoặc chạy trực tiếp từ nguồn để luôn có phiên bản mới nhất
npx https://github.com/google-gemini/gemini-cli

Khi bạn chạy lần đầu tiên, chương trình sẽ hỏi bạn một số câu hỏi. Nếu bạn chạy ứng dụng này từ một IDE (ví dụ: VSCode), ứng dụng sẽ hỏi bạn câu hỏi sau

91769e12a6214c89.png

Sau đó, hệ thống sẽ yêu cầu bạn chọn một trong số các phương thức xác thực

61ba181d61e506dc.png

Có nhiều tùy chọn:

  • Nếu bạn chọn Đăng nhập bằng Google, thì một trang Xác thực của Google sẽ mở ra trong trình duyệt và bạn chỉ cần chấp nhận trang này
  • Nếu muốn sử dụng Khoá Gemini API, bạn sẽ cần tạo một khoá trên trang AI Studio, sau đó tạo tệp .env trong thư mục làm việc của bạn với biến GEMINI_API_KEY được đặt ( hoặc chạy lệnh export GEMINI_API_KEY="your-api-key" trên dòng lệnh)
  • Nếu chọn sử dụng Vertex AI, bạn sẽ cần một dự án như đã thiết lập trước đó, đồng thời tạo tệp .env và đặt GOOGLE_CLOUD_PROJECTGOOGLE_CLOUD_LOCATION

Nếu muốn thay đổi các phương thức xác thực này, bạn có thể chạy lệnh /auth từ Gemini CLI hoặc chỉnh sửa tệp cấu hình. Nếu bạn muốn chỉnh sửa trực tiếp tệp cấu hình, thì trên Linux, tệp này phải nằm trong $HOME/.gemini/settings.json . Bạn sẽ thấy loại securityauth, đồng thời có thể chỉnh sửa loại này

{
  "security": {
    "auth": {
      "selectedType": "vertex-ai" # or "gemini-api-key" or "oauth-personal"
    }
  }
}

2b894cdf68057d6a.png

4. 🚀 Lệnh cơ bản và công cụ tích hợp

Giờ hãy khám phá Gemini CLI để tìm hiểu thêm về công cụ này. Chạy lệnh sau trong thiết bị đầu cuối để truy cập Gemini CLI

gemini

nếu đang tìm một số lệnh cơ bản có thể sử dụng, bạn có thể nhập /help để hiển thị tất cả các lệnh có sẵn

d4776f0c740ad723.png

/help

Bạn sẽ thấy kết quả như sau 290d620f3787b3d0.png

Gemini CLI là một AI Agent, do đó, công cụ này sẽ được trang bị các công cụ để giải quyết nhiệm vụ do người dùng giao. Để xem các công cụ tích hợp mà nó có, hãy chạy lệnh /tools

7367214e26b0da86.png

/tools

Bạn sẽ thấy kết quả như sau

363ae783ae902fe4.png

Bạn có thể thấy rằng Gemini CLI có một số chức năng như đọc và ghi vào tệp, tìm kiếm trên web và nhiều chức năng khác. Theo mặc định, một số công cụ này yêu cầu người dùng xác nhận do có nguy cơ tiềm ẩn

Bây giờ, hãy xem ví dụ thực tế bằng cách chạy các câu lệnh này trong Gemini CLI

be23caafc0184a6d.png

Find top 10 OWASP security issue and write it down to owasp.md

Bạn sẽ thấy công cụ này sẽ gọi GoogleSearch và sau đó sẽ ghi kết quả bằng WriteFile. Nếu sử dụng IDE, bạn sẽ thấy rằng IDE sẽ trình bày dưới dạng một lựa chọn khác biệt và hiển thị cho dù bạn muốn chấp nhận hay từ chối các đề xuất. Tại đây, bạn có thể thấy Gemini CLI yêu cầu bạn cấp quyền ghi tệp

724bc8144b51752e.png

5. 🚀 Tiện ích

Để cải thiện kết quả của một tác vụ cụ thể bằng Trợ lý AI, những điều khó khăn là cách chúng ta có thể tạo ra một câu lệnh phù hợp, quản lý kỹ thuật ngữ cảnh phù hợp bằng cách tích hợp các công cụ phù hợp, v.v.

Tiện ích Gemini CLI là một tập hợp các câu lệnh và tính năng tích hợp được đóng gói sẵn và dễ dàng cài đặt, có thể kết nối với các công cụ bên ngoài. Mỗi tiện ích đều có một "sổ tay" tích hợp về cách sử dụng các công cụ một cách hiệu quả và có thể bao gồm những thành phần sau:

  • Lệnh dấu gạch chéo tuỳ chỉnh
  • Cấu hình MCP
  • Tệp ngữ cảnh

cfe24ebe1dfb0152.png

Cài đặt tiện ích bảo mật

Ví dụ: trong hướng dẫn này, chúng ta sẽ tìm hiểu cách cài đặt các tiện ích code-reviewsecurity

Chạy lệnh sau để cài đặt các tiện ích security từ thiết bị đầu cuối

gemini extensions install https://github.com/gemini-cli-extensions/security

Hệ thống sẽ hiển thị các câu hỏi sau, bạn chỉ cần nhấn enter để chấp nhận

Installing extension "gemini-cli-security".
**Extensions may introduce unexpected behavior. Ensure you have investigated the extension source and trust the author.**
This extension will run the following MCP servers:
  * securityServer (local): node /home/alvinprayuda/.gemini/extensions/gemini-cli-security/mcp-server/dist/security.js
This extension will append info to your gemini.md context using GEMINI.md
Do you want to continue? [Y/n]:
Extension "gemini-cli-security" installed successfully and enabled.

Cài đặt tiện ích đánh giá mã

Tiếp theo, hãy cài đặt tiện ích code-review, chạy lệnh bên dưới

gemini extensions install https://github.com/gemini-cli-extensions/code-review

Sau khi hoàn tất, hãy chạy lại Gemini CLI

gemini

và chạy lệnh /extensions, bạn sẽ thấy 2 tiện ích này đã được cài đặt

571556bdc2b3e914.png

/extensions

Được rồi, bây giờ hãy thực hiện một thao tác thực tế trên kho lưu trữ mẫu mà bạn đã sao chép trước đó

6. 🚀 Chế độ tương tác – Ứng dụng tiện ích phân tích bảo mật mã

Tiện ích Bảo mật là một tiện ích Gemini CLI mã nguồn mở, được xây dựng để tăng cường tính bảo mật của kho lưu trữ. Tiện ích này bổ sung một lệnh mới vào Gemini CLI để phân tích các thay đổi về mã nhằm xác định nhiều rủi ro và lỗ hổng bảo mật.

Bây giờ, trước tiên hãy chuẩn bị kho lưu trữ minh hoạ của chúng ta, chạy lệnh sau để chuyển sang nhánh nơi các thay đổi có rủi ro bảo mật đã được áp dụng

git checkout refactor/analysis-demo

Sau đó, hãy chạy Gemini CLI trong thiết bị đầu cuối

gemini

Sau đó, hãy chạy các tiện ích

aab23afb4f4bfb3.png

/security:analyze

Thao tác này sẽ bắt đầu một quy trình chạy dài và trong quá trình này, bạn sẽ nhận được một số yêu cầu gián đoạn để xin phép bạn chạy một thao tác cụ thể, chẳng hạn như mkdir như minh hoạ dưới đây

f889f7aca882f87d.png

Đây là một cơ chế bảo vệ để đảm bảo người dùng biết những gì sẽ được thực thi bởi Gemini CLI. Trong phần còn lại của hướng dẫn, bạn luôn có thể cho phép ( lựa chọn 2).

Tiện ích này sẽ gọi một quy trình chạy trong thời gian dài, bạn có thể thấy tiện ích này tạo một tệp lập kế hoạch bên trong thư mục .gemini_security và bạn có thể thấy danh sách kiểm tra cho biết quy trình đã hoàn tất hay chưa. Như minh hoạ trong ví dụ bên dưới:

bf7f9e885f15ff89.png

Sẽ mất một khoảng thời gian để hoàn thành các tác vụ của nó. Trong khi chờ đợi, chúng ta có thể kiểm tra nguồn của các tiện ích này trong kho lưu trữ Github. URL này cho thấy lời nhắc được dùng để chạy tất cả quy trình quét bảo mật này

e5592755fcdf5a64.png

Như bạn có thể thấy, để thực hiện việc quét này, hãy dùng câu lệnh Gemini CLI để thực hiện quy trình kiểm tra hai lượt, Lượt trinh sátLượt điều tra chi tiết hơn.

Nếu gặp lời nhắc sau đây trong Gemini CLI, bạn có thể chọn lựa chọn 2 để tắt tính năng phát hiện vòng lặp

74426d4ae8fae006.png

Sau đó, hãy nhắc Gemini CLI tiếp tục

3ea7391ccbf2b872.png

continue

Đây là một cơ chế để tránh các vòng lặp gọi công cụ vô tận không hiệu quả và sẽ tiếp tục được cải thiện theo thời gian.

Sau khi hoàn tất, báo cáo sẽ xuất hiện trên thiết bị đầu cuối tương tác. Để dễ dàng hơn, hãy hướng dẫn Gemini CLI ghi báo cáo vào security-analysis.md

86fcc1c406100224.png

write the result to security-analysis.md file

Giờ đây, bạn có thể kiểm tra kết quả được ghi vào tệp

7. 🚀 Chế độ không tương tác – Ứng dụng tiện ích xem xét mã

Tiện ích code-review sẽ thêm một lệnh mới vào Gemini CLI để phân tích các thay đổi về mã nhằm xác định nhiều vấn đề về chất lượng mã.

Tiện ích này có thể được thực thi ở chế độ không tương tác của Gemini CLI, tức là bạn có thể thực thi toàn bộ quy trình mà không cần nhập trình bao Gemini CLI. Để chạy Gemini CLI ở chế độ không tương tác, bạn có thể thực hiện bằng mẫu lệnh sau

gemini "put your command here"

Tuy nhiên, bạn cần lưu ý rằng khi chạy ở chế độ không tương tác, mọi thao tác của công cụ yêu cầu quyền của người dùng sẽ bị vô hiệu hoá. Do đó, chúng ta cần thêm cờ --yolo để tự động phê duyệt tất cả các hành động, tức là bật tất cả các công cụ trong chế độ không tương tác

Nếu bạn chạy cờ yolo này trong cloudshell, cấu hình mặc định của hệ thống sẽ ngăn bạn chạy cờ này và cho thấy thông báo lỗi sau

Cannot start in YOLO mode when it is disabled by settings

Chạy lệnh sau để thiết lập tệp cấu hình ở cấp không gian làm việc

mkdir .gemini && cloudshell edit .gemini/settings.json

Giờ đây, tệp settings.json sẽ được mở trong trình chỉnh sửa, hãy sao chép cấu hình sau để cho phép chế độ yolo

{
    "security": {
        "disableYoloMode": false
    }
}

Bây giờ, hãy chạy tiện ích code-review bằng lệnh sau

gemini "/code-review" --yolo -e code-review > code-review.md

Lệnh này sẽ ghi kết quả của đầu ra Gemini CLI vào tệp code-review.md. Lưu ý cờ -e ở đây, cờ này kiểm soát tiện ích nào sẽ kích hoạt trong phiên. Ở đây, chúng ta chỉ kích hoạt tiện ích code-review và tắt các tiện ích khác.

Quá trình này sẽ mất một lúc, nhưng sau khi hoàn tất, bạn có thể thấy kết quả tương tự như kết quả được ghi vào tệp đánh dấu bên dưới

Here are the results of the code review.

While the recent changes to rename `get_products` and `get_product` to `GetProducts` and `GetProduct` are minor, the codebase has some inconsistencies in its naming conventions. For instance, other functions like `create_product` use `snake_case`, while the newly renamed functions use `PascalCase`. For better code quality and readability, I recommend using a consistent naming convention throughout the project.

More importantly, I have identified several security vulnerabilities in the `main.py` file. Here is a summary of the findings:

### 1. SQL Injection
*   **Severity**: High
*   **Location**: 
    *   `main.py:99` in `get_products_by_category`
    *   `main.py:146` in `search_products`
    *   `main.py:372` in `get_user_transactions`
    *   `main.py:438` in `adjust_inventory_by_query`
*   **Description**: The endpoints directly use f-strings to construct SQL queries, making them vulnerable to SQL injection attacks. An attacker could manipulate the input to execute arbitrary SQL commands, potentially leading to data breaches or unauthorized modifications.
*   **Recommendation**: Use parameterized queries or an ORM to handle database interactions. This will ensure that user input is properly sanitized and prevent SQL injection attacks.

### 2. Server-Side Request Forgery (SSRF)
*   **Severity**: High
*   **Location**: `main.py:265` in `fetch_url`
*   **Description**: The `fetch_url` endpoint allows users to specify an arbitrary URL, which the server then requests. This can be exploited to make requests to internal services or local files, leading to information disclosure or other security breaches.
*   **Recommendation**: Implement a whitelist of allowed domains or protocols to restrict the URLs that can be requested. Additionally, you can disable redirects and use a timeout to limit the impact of an attack.

### 3. Information Exposure
*   **Severity**: Medium
*   **Location**: `main.py:423` in `get_environment_variables`
*   **Description**: The `get_environment_variables` endpoint exposes all environment variables to the user. This can include sensitive information such as API keys, database credentials, and other secrets.
*   **Recommendation**: Remove this endpoint or restrict access to it to authorized users. If you need to expose some environment variables, do so selectively and avoid exposing sensitive information.

8. 🚀 Hỗ trợ giao thức ngữ cảnh mô hình

Giờ đây, như chúng ta đã kiểm tra trước đó trong phần giải thích về tiện ích, Gemini CLI có thể kết nối với các máy chủ MCP – những ứng dụng cung cấp các công cụ và tài nguyên thông qua Giao thức ngữ cảnh mô hình. Mối kết nối này cho phép Gemini CLI tương tác với các hệ thống và nguồn dữ liệu bên ngoài bằng cách sử dụng các máy chủ MCP làm cầu nối đến môi trường cục bộ và các dịch vụ bên ngoài như API.

7d8738ee9c079aa1.png

Nếu muốn tự thiết lập máy chủ MCP, bạn cần sửa đổi tệp .gemini/settings.json và thêm các cấu hình sau :

{
    ...
    # Previous settings above if any
    "mcpServers": {
       "server_name": {
           # MCP server configurations here
       }
    }
}

Trong hướng dẫn này, hãy thiết lập kết nối với tài khoản Github của bạn để đẩy dữ liệu báo cáo trước đó vào Github

Định cấu hình máy chủ MCP của GitHub

Trước tiên, hãy tạo tệp cấu hình dự án Gemini CLI. Chạy lệnh sau

mkdir -p .gemini && touch .gemini/settings.json

Sau đó, mở tệp .gemini/settings.json rồi điền cấu hình sau vào

{
  "mcpServers": {
       "github": {
            "httpUrl": "https://api.githubcopilot.com/mcp/",
            "headers": {
                "Authorization": "your-personal-access-token"
            },
            "timeout": 5000
       }
  }
}

Bây giờ, chúng ta sẽ cần mã truy cập cá nhân của riêng bạn trên Github. Do đó, hãy đảm bảo bạn đã có tài khoản Github của riêng mình.

Đăng nhập vào Github rồi chuyển đến phần Settings (Cài đặt)

c7d83d4e503602e2.png

Sau đó, hãy di chuyển xuống để tìm Cài đặt cho nhà phát triển rồi nhấp vào đó

c6c9bfafe5021b9e.png

Sau đó, chọn Personal access tokens (Mã truy cập cá nhân) rồi chọn Tokens (classic) (Mã thông báo (cổ điển))

e21f0ed9f361fc13.png

c3c26d7f41c51e1c.png

Đặt tên cho mã truy cập cá nhân của bạn tại đây và kiểm tra các phạm vi repo

b0830480eaf3c15d.png

Sau đó, di chuyển xuống rồi nhấp vào nút Generate Token (Tạo mã thông báo), hãy nhớ

Nhấp vào nút Tạo mã thông báo mới rồi chọn Tạo mã thông báo mới (cổ điển). Sau đó, hãy sao chép mã thông báo đã tạo và ghi mã này vào .gemini/settings.json

30d1ea92bb24a7ba.png

Vì vậy, tệp .gemini/settings.json của bạn sẽ có dạng như ví dụ sau

{
  "mcpServers": {
       "github": {
            "httpUrl": "https://api.githubcopilot.com/mcp/",
            "headers": {
                "Authorization": "ghp-xxxx"
            },
            "timeout": 5000
       }
  }
}

Bây giờ, hãy xác minh kết nối. Nhập Gemini CLI bằng cách chạy lệnh sau

gemini

Sau đó, chạy lệnh /mcp, bạn sẽ thấy MCP Github đã được định cấu hình đúng cách

1e9c8585ecb39ccb.png

/mcp

Sau đó, hãy kiểm thử kết nối MCP này bằng cách gửi lệnh sau

70e045049e8792a8.png

Aggregate the findings from @code-review.md and @security-analysis.md into a single report and ensure no duplicates issues reported. Post this report as a comment on the relevant pull request for the current git branch on GitHub and display the pull request URL for manual review

Lưu ý ký hiệu @code-review.md@security-analysis.md tại đây. Đây là cách chúng ta tham chiếu các tệp sẽ được truyền đến Gemini CLI. Lệnh này sẽ đọc nội dung của cả hai tệp và gửi một bình luận đến Yêu cầu hợp nhất liên quan đến nhánh này bằng cách sử dụng kết nối MCP của Github. Sau đó, bạn có thể kiểm tra URL yêu cầu kéo để xác minh.

f6483c19e27d4d1c.png

9. 💡Gemini CLI trong quy trình CI/CD

Nếu là người dùng GitHub, bạn có thể dễ dàng nhúng Gemini CLI vào quy trình CI/CD bằng cách sử dụng run-gemini-cli GitHub Action. Đây vừa là một tác nhân tự động cho các công việc lập trình thường xuyên quan trọng, vừa là một cộng tác viên theo yêu cầu mà bạn có thể nhanh chóng uỷ quyền công việc

Bạn có thể sử dụng công cụ này để xem xét yêu cầu kéo, phân loại vấn đề, phân tích và sửa đổi mã, cũng như làm nhiều việc khác bằng cách trò chuyện với Gemini ngay trong kho lưu trữ GitHub

Bạn có thể kiểm tra ví dụ về quy trình tích hợp này trong yêu cầu kéo này. Trong đó, chúng tôi sử dụng tiện ích Bảo mật Gemini CLI bên trong trình chạy và đưa ra các đánh giá khi Yêu cầu kéo được tạo

bc58be84fcbb313a.png

da9e2cde49cbebe5.png

3deda99e8a7fa4d3.png

d933d6b31b42e582.png

10. 💡Khám phá các tiện ích khác của Gemini CLI

dd25e5619e91ad0b.png

Bạn cũng có thể khám phá thêm các tiện ích tại https://geminicli.com/extensions . Hãy khám phá để biết thêm nhiều công cụ thú vị khác!

11. 🧹 Dọn dẹp

Để tránh phát sinh phí cho tài khoản Google Cloud của bạn đối với các tài nguyên được dùng trong lớp học lập trình này, hãy làm theo các bước sau:

  1. Trong Google Cloud Console, hãy chuyển đến trang Quản lý tài nguyên.
  2. Trong danh sách dự án, hãy chọn dự án mà bạn muốn xoá, rồi nhấp vào Xoá.
  3. Trong hộp thoại, hãy nhập mã dự án rồi nhấp vào Tắt để xoá dự án.