如何使用 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 variableUSERNAME
。
另一个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 获取当前登录的用户?的主要内容,如果未能解决你的问题,请参考以下文章
使用 ASP.NET 表单身份验证时如何获取当前登录用户的用户 ID?
如何使用 Spring Security 和 Thymeleaf 获取当前登录用户的 ID