Quản Lý IIS Qua Trình Duyệt Web: Giải Pháp Tiện Lợi Cho Doanh Nghiệp
Chào các bạn! Hôm nay mình sẽ trình bày một chủ đề mới và thú vị: Quản lý IIS qua trình duyệt web.
1. Vấn Đề Cần Giải Quyết
Trong một công ty thường có nhiều nhóm cùng phát triển và sử dụng chung một máy chủ Windows để triển khai các trang nội bộ lên IIS. Bộ phận IT thường giới hạn số lượng người truy cập cùng một lúc, dẫn đến tình trạng nhiều người muốn truy cập để triển khai, khởi động lại hoặc chỉnh sửa cấu hình cùng lúc. Điều này gây khó khăn cho các nhóm trong việc quản lý dịch vụ của mình.
2. Ý Tưởng Đưa Ra
Giải pháp mà mình nghĩ đến là phát triển một trang web cho phép người dùng thao tác trực tiếp với IIS trên máy chủ. Người dùng chỉ cần đăng nhập vào trang web này dựa vào quyền được cấp để thực hiện các thao tác cần thiết trên IIS.
3. Giải Pháp Kỹ Thuật
Mình sẽ xây dựng một trang web bằng ASP.NET Core Razor Pages. Để thao tác với IIS, mình sẽ sử dụng thư viện Microsoft.Web.Administration. Cơ sở dữ liệu sử dụng SQLite, vì nó đơn giản và chỉ cần một file nhỏ.
4. Bắt Đầu Lập Trình
4.1. Quản Lý Website
Trước tiên, mình sẽ tạo một lớp Website
để quản lý và hiển thị thông tin các website đang chạy trên IIS.
csharp
public class Website
{
public long Id { get; set; }
public string Name { get; set; }
public string State { get; set; }
public int Port { get; set; }
}
Để lấy tất cả các website, chúng ta sử dụng mã sau:
csharp
public void GetAllSites()
{
using (ServerManager server = new ServerManager())
{
this.Websites = new List<Website>();
foreach (var item in server.Sites)
{
var web = new Website()
{
Name = item.Name,
State = item.State.ToString(),
Id = item.Id
};
foreach (var b in item.Bindings)
{
web.Port = b.EndPoint.Port;
break;
}
this.Websites.Add(web);
}
}
}
Để khởi động hoặc dừng một website:
csharp
public void OnPostStart(long site)
{
using (ServerManager server = new ServerManager())
{
foreach (var item in server.Sites)
{
if (item.Id == site && (item.State == ObjectState.Stopped || item.State == ObjectState.Stopping))
{
item.Start();
break;
}
}
}
this.GetAllSites();
}
public void OnPostStop(long site)
{
using (ServerManager server = new ServerManager())
{
foreach (var item in server.Sites)
{
if (item.Id == site && (item.State == ObjectState.Started || item.State == ObjectState.Starting))
{
item.Stop();
break;
}
}
}
this.GetAllSites();
}
Các thao tác khác mình sẽ cập nhật sau trên GitHub dấu bên dưới.
4.2. Quản Lý Application Pool
Tương tự như việc quản lý website, mình cũng sẽ tạo một lớp AppPool
để quản lý các application pool.
csharp
public class AppPool
{
public string Name { get; set; }
public string State { get; set; }
}
Để lấy thông tin tất cả các application pool:
csharp
public void GetAllPools()
{
using (ServerManager server = new ServerManager())
{
this.AppPools = new List<AppPool>();
foreach (var item in server.ApplicationPools)
{
this.AppPools.Add(new AppPool()
{
Name = item.Name,
State = item.State.ToString()
});
}
}
}
Để khởi động hoặc dừng một application pool:
csharp
public void OnPostStop(string pool)
{
using (ServerManager server = new ServerManager())
{
foreach (var item in server.ApplicationPools)
{
if (item.Name == pool)
{
item.Stop();
}
}
}
this.GetAllPools();
}
public void OnPostStart(string pool)
{
using (ServerManager server = new ServerManager())
{
foreach (var item in server.ApplicationPools)
{
if (item.Name == pool)
{
item.Start();
}
}
}
this.GetAllPools();
}
Các thao tác khác sẽ được cập nhật trên GitHub trong thời gian tới.
4.3. Các Chức Năng Khác
Ngoài những chức năng đã đề cập, mình cũng dự kiến sẽ phát triển thêm các tính năng như quản lý người dùng thông qua quá trình đăng nhập, phân quyền sử dụng cho các tài khoản khác nhau. Mọi tiến bộ về dự án này sẽ được cập nhật thường xuyên trên GitHub của mình tại iis.dashboard
.
source: viblo