簡體   English   中英

如何使用C#在Window OS中的系統NT Authority\System下創建新用戶

[英]How to Create New User under NT Authority\System the System in Window OS using C#

現在我的服務在 NT Local 系統下運行。 我想創建 NTUser 類型來運行該服務。 我不想創建本地系統帳戶。 在服務中,當您查看在NT Service__下運行的某些帳戶時。 我還希望創建自定義 NT Service\CustomName 用戶來運行該服務。

因此,您的問題是創建帳戶或在帳戶下動態運行服務。 如果是后者,請在C#中使用模擬。

我對你的問題感到困惑,讓我猜猜你可能想做什么:你正在嘗試使用內置的 [NT AUTHORITY\SYSTEM] 帳戶來授權你的應用程序使用其他服務。

以下是我如何通過我的 C# MVC web 應用程序使用 [NT AUTHORITY\SYSTEM] 帳戶來授權訪問本地 sql 服務器數據庫。

.NET 框架

// Views/Home/Index.cshtml
@ViewBag.Title="Home Page";

<div class="jumbotron">
    <h1>Hello @Model</h1>
    .....
// Controllers/HomeController.cs
using System.Data;
using System.Data.SqlClient;
using System.Web.Mvc;

public class HomeController : Controller
{
  private string _connStr = @"
    Database=MyDB;Integrated Security=true;";

  public ActionResult Index() 
  {
    using var conn = new SqlConnection(_connStr);
    conn.Open();
    var cmd = new SqlCommand(@"
      SELECT TOP 1 [name] FROM [dbo].[person];", conn);
    var reader = cmd.ExecuteReader();
    if (reader.Read())
      return View("index", reader["name"]);
    else
      throw new DataException("Nobody is in Person table!");
  }
}

SQL

IF NOT EXISTS(SELECT 1 FROM sys.syslogins WHERE name = 'NT AUTHORITY\SYSTEM')
BEGIN
    CREATE LOGIN [NT AUTHORITY\SYSTEM]
        FROM WINDOWS WITH DEFAULT_LANGUAGE = [us_english];

    GRANT CONNECT TO [NT AUTHORITY\SYSTEM];
END

IF NOT EXISTS(SELECT 1 FROM sys.sysusers WHERE name = 'NT AUTHORITY\SYSTEM')
BEGIN
    CREATE USER [NT AUTHORITY\SYSTEM] FOR LOGIN [NT AUTHORITY\SYSTEM];

    ALTER ROLE [db_reader] ADD MEMBER [NT AUTHORITY\SYSTEM];
END

IF NOT EXISTS(SELECT 1 FROM sys.tables WHERE name = 'person') 
BEGIN 
    CREATE TABLE [dbo].[person] (
        [id]   UNIQUEIDENTIFIER CONSTRAINT [DF_dbo.person_id] DEFAULT (NEWID()) ROWGUIDCOL NOT NULL,
        [name] NVARCHAR (50)    NULL,
        CONSTRAINT [PK_dbo.person] PRIMARY KEY CLUSTERED ([id] ASC)
    );

    INSERT INTO dbo.person
    SELECT NEWID(), 'BILLY'
END

IIS

Default App Pool Application Pool 更改為LocalSystem標識,並將您的 .Net Framework MVC 應用程序發布到您的C:\.netpub\wwwroot

綜合安全

您現在有一個 web 應用程序在LocalSystem身份 ( NT AUTHORITY\SYSTEM ) 下運行,並且已授予內置NT AUTHORITY\SYSTEM用戶訪問權限以連接到您的數據庫服務器。 在 SQL 服務器中,您已經為您的NT AUTHORITY\SYSTEM登錄創建了一個NT AUTHORITY\SYSTEM用戶。 您還授予 SQL 用戶[db_reader]對您的dbo模式的權限。

為什么這很重要?

Integrated Security 使用 Kerberos 身份驗證從 Windows 服務器到 Windows 服務器進行身份驗證。 在許多組織中,創建 Active Directory 用戶是為了為 IIS 應用程序池提供身份,以使用集成安全訪問數據庫。

在這些 AD 帳戶下運行Application Pool允許對每個應用程序池有權訪問的內容進行細粒度控制。 此外,它還避免了必須將密碼合並到應用程序配置中的情況。

本地開發時 Active Directory 身份用戶方法的問題

用於身份的 AD 用戶的問題是您需要訪問 Active Directory 以在本地模擬生產設置。 您不應該訪問模擬基於 AD 用戶的確切身份驗證所需的密碼,並且無論如何您都不想使用它,以防萬一您不小心將生產數據庫作為目標。 更糟糕的是,您可能需要將整個開發域與生產域保持一致,以確保您可以訪問所有必要的 AD 帳戶。

內置身份驗證是我們對 Active Directory 的“測試替身”。 使用 NT AUTHORITY\SYSTEM 帳戶,您可以快捷方式完全使用 Active Directory,並將所有身份驗證保留在本地。 這是開發工作應該首先完成的地方。 .

我喜歡更狹隘地對待集成測試,並通過用測試替身替換單獨的服務和數據庫來一次測試一個集成點。 連同契約測試和針對測試替身運行契約測試以及實際實現,您可以提出更快、更獨立且通常更容易推理的集成測試。

- Martin Fowler: 實用測試金字塔

現在我們可以調試(以管理員身份運行 Visual Studio),直接針對 IIS,使用“測試替身”進行 Active Directory 身份驗證。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM