sql server -如何使用c#在windows操作系统下创建新用户

本文关键字:新用户 创建 用户 操作系统 windows server 何使用 sql | 更新日期: 2023-09-27 17:51:18

现在我的服务在NT本地系统下运行。我想创建NTUser类型来运行服务。我不想创建本地系统帐户。在服务中,当你看到一些帐户运行在NT Service__下时。我还希望创建自定义NT服务'CustomName用户来运行该服务。

sql server -如何使用c#在windows操作系统下创建新用户

所以,您的问题是创建帐户或在帐户下动态运行服务。如果是后者,请在c#中使用Impersonation。

我对你的问题感到困惑,让我猜一猜你可能想做什么:你试图使用内置的[NT AUTHORITY'SYSTEM]帐户来授权你的应用程序使用其他服务。

这是我如何使用[NT AUTHORITY'SYSTEM]帐户与我的c# MVC web应用程序来授权访问本地sql server数据库。

。净框架

// 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应用程序池更改为LocalSystem身份,并将。net框架MVC应用程序发布到C:'inetpub'wwwroot

<标题>集成安全

您现在有一个web应用程序在LocalSystem身份(NT AUTHORITY'SYSTEM)下运行,并授予内置的NT AUTHORITY'SYSTEM用户访问权限来连接到您的数据库服务器。在SQL Server中,您已经为NT AUTHORITY'SYSTEM登录创建了一个NT AUTHORITY'SYSTEM用户。您还在dbo模式上授予了SQL用户[db_reader]

为什么这很重要?

Integrated Security使用Kerberos认证实现从Windows服务器到Windows服务器的身份验证。在许多组织中,创建Active Directory用户是为了向IIS应用程序池提供身份,以便使用集成安全性访问数据库。

在这些AD帐户下运行Application Pool允许对每个应用程序池有权访问的内容进行细粒度控制。此外,它还可以防止必须将密码合并到应用程序配置中。

本地开发时ACTIVE DIRECTORY身份用户方法的问题

使用AD Users作为身份的问题是,您需要访问Active Directory来模拟本地生产设置。您不应该有权访问模拟完全基于AD用户的身份验证所需的密码,而且您也不希望使用它,以防万一您意外地瞄准了生产数据库。更糟糕的是,您可能需要将整个开发域与生产域保持同等地位,以确保您可以访问所有必要的AD帐户。

内置验证是我们的"test double"用于Active Directory。使用NT AUTHORITY'SYSTEM帐户,您可以快捷方式"完全使用活动目录",并将所有身份验证保持在本地。这是开发工作首先应该做的地方。

我喜欢更狭义地对待集成测试,一次测试一个集成点,用测试副本替换单独的服务和数据库。结合契约测试和针对测试副本运行契约测试以及实际实现,您可以提出更快,更独立并且通常更容易推理的集成测试。

- Martin Fowler: The Practical Test Pyramid

现在我们可以调试(以管理员身份运行Visual Studio),直接针对IIS,使用"test double"