如何使用 C# 通过他的 ID 获取当前登录的用户?

Posted

技术标签:

【中文标题】如何使用 C# 通过他的 ID 获取当前登录的用户?【英文标题】:How to get currently logged in user by his ID using C#? 【发布时间】:2019-05-05 13:40:03 【问题描述】:

我想编写一个代码,这使得只有当前登录的用户能够只使用他的 ID 更新 DataGridView 中的数据,他必须在 textBox1 中写入,按下按钮,从而更新所选行中的数据。现在当前登录的用户也可以使用其他用户的 ID 更新 DataGridView 中的数据,这应该是不可能的。我试过这段代码:

  private void button5_Click(object sender, EventArgs e)
    
        string ID = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
        if (textBox1.Text == "" || textBox1.Text != ID)
        
            MessageBox.Show("Insert your ID and try again.");
        
        else
         
            try
            
            String ConnectionString = @"Data Source=.\SQLEXPRESS01;Initial Catalog=Vagtplan;Integrated Security=True";
            SqlConnection myconnection = new SqlConnection(ConnectionString);
            myconnection.Open();
            DateTime primaryKey= Convert.ToDateTime(dataGridView1.SelectedRows[0].Cells[0].Value);
            SqlCommand AddNumberCommand = myconnection.CreateCommand();
            AddNumberCommand.CommandText = "UPDATE dbo.Vagter SET [ansatID] = @ansatID WHERE [Dato] = @dato";
            AddNumberCommand.Parameters.Add("@ansatID", SqlDbType.Int).Value = textBox1.Text;
            AddNumberCommand.Parameters.Add("@dato", SqlDbType.DateTime).Value = primaryKey;
            AddNumberCommand.ExecuteNonQuery();
            myconnection.Close();
            
            catch (Exception ex)
            
            MessageBox.Show(ex.Message);
            
            finally
            
            MessageBox.Show("Du har valgt vagten.");
            
        

但是,字符串 ID = System.Security.Principal.WindowsIdentity.GetCurrent().Name 在这种情况下没有帮助。 ID 也被声明为“int”数据类型。

预期的结果是,如果当前登录的用户在 textBox1 中写入其他用户的 ID 并尝试在 DataGridView 中按按钮更新数据,那么他会收到一条错误消息,例如“您必须使用您的 ID”或其他内容像这样。

【问题讨论】:

您可以评估environment variable USERNAME 另一个related post。 用户名是字符串。 【参考方案1】:

由于使用的是Windows认证,所以可以使用SUSER_NAME()SQL函数获取当前用户名,例如:

UPDATE Table1 SET Column1 = SUSER_NAME()

如果出于任何原因您想在 C# 代码中获取用户名,使用Environment.UserName 获取运行应用程序的用户名,使用Environment.UserDomainName 获取他的域:

var userName = $@"Environment.UserDomainName\Environment.UserName"

然后你可以将它作为参数传递给查询。

【讨论】:

好吧,机器人查询会是什么样子呢?是不是有点像? : AddNumberCommand.CommandText = "更新 dbo.Vagter SET [ansatID] = SUSER_NAME WHERE [Dato] = @dato"; AddNumberCommand.Parameters.Add(SUSER_NAME, SqlDbType.Int).Value = textBox1.Text; AddNumberCommand.Parameters.Add("@dato", SqlDbType.DateTime).Value = primaryKey; 不,对于第一种情况,用户名不需要任何参数,只需使用var cmdText = "UPDATE Table1 SET Column1 = SUSER_NAME()";之类的查询即可。 或者(在第二种情况下):String ID = Environment.UserName; AddNumberCommand.CommandText = "更新 dbo.Vagter SET [ansatID] = @ID WHERE [Dato] = @dato"; AddNumberCommand.Parameters.Add(@ID, SqlDbType.Int).Value = textBox1.Text; AddNumberCommand.Parameters.Add("@dato", SqlDbType.DateTime).Value = primaryKey; 我假设您要更新 Column1 并将其设置为当前用户的名称,其中 Column2 具有特定值。那么查询将是var cmdText = "UPDATE Table1 SET Column1 = SUSER_NAME() WHERE Column2 = @Column2"; 然后对于命令对象,只需为@Column2 添加一个参数并将其值设置为具体值。 它不起作用....我收到一个错误:''将 nvarchar 值'LAPTOP-C6NQOS6Q/Pawel'转换为数据类型 int 时失败。'''LAPTOP-C6NQOS6Q/ Pawel' 是我的笔记本的名称,并且 [ansatID](使用用户 ID 更新数据的列)声明为 int 数据类型。

以上是关于如何使用 C# 通过他的 ID 获取当前登录的用户?的主要内容,如果未能解决你的问题,请参考以下文章

如何在解析云代码功能中获取用户 ID?

使用 ASP.NET 表单身份验证时如何获取当前登录用户的用户 ID?

如何使用 Spring Security 和 Thymeleaf 获取当前登录用户的 ID

PHP获得当前登录用户ID,详细代码写法

Xamarin.Forms如何获取当前登录用户的Id等信息?

java 如何获取当前AD域用户名?