C# 获取SQLAgent用户名失败
我有下面的windows控制台程序代码,它应该显示为NT Authoroty\Network Service,但令人惊讶的是,它拼写为NetworkService,没有空格。。。当我检查SQLAgent运行的帐户时,它确实是网络服务 为什么此代码会删除空格?由于NetworkService不存在,因此它会分解我的所有解决方案 PS:我不想硬编码用户;我必须自动得到它C# 获取SQLAgent用户名失败,c#,.net,visual-studio,wmi,clr4.0,C#,.net,Visual Studio,Wmi,Clr4.0,我有下面的windows控制台程序代码,它应该显示为NT Authoroty\Network Service,但令人惊讶的是,它拼写为NetworkService,没有空格。。。当我检查SQLAgent运行的帐户时,它确实是网络服务 为什么此代码会删除空格?由于NetworkService不存在,因此它会分解我的所有解决方案 PS:我不想硬编码用户;我必须自动得到它 class Program { static string GetSQLAgentUsername() {
class Program
{
static string GetSQLAgentUsername()
{
string servicePath = string.Format("Win32_Service.Name='{0}'", "SQLSERVERAGENT");
using (ManagementObject theService = new ManagementObject(new ManagementPath(servicePath)))
{
return theService.Properties["StartName"].Value.ToString();
}
}
static void Main(string[] args)
{
System.Console.WriteLine(GetSQLAgentUsername());
System.Console.ReadKey();
}
}
据认为,这是因为:
当安全子系统将此帐户名本地化时,SCM将执行此操作
不支持本地化名称。因此,您将收到一份本地化的
LookupAccountSid函数中此帐户的名称,但名称
调用时,帐户的名称必须是NT AUTHORITY\NetworkService
CreateService或ChangeServiceConfig,不考虑语言环境,或
可能会出现意外的结果
从WMO检索名称时获得的值,即逐字传递给CreateService(AUTHORITY\NetworkService)的值
如果有另一个API需要“AUTHORITY\networkservice”,我会感到惊讶,你能举个例子吗?这段代码还返回“NT AUTHORITY\networkservice”
SecurityIdentifier ident=new SecurityIdentifier(WellKnownSidType.NetworkServiceSid,null);字符串名称=标识转换(typeof(NTAccount)).Value代码>我遇到这个问题主要是因为TFSAPI使用本地化名称。如果我查询特定用户的工作区(在本例中为构建服务器的服务帐户),我需要将从WMI接收的帐户转换为TFS API所需的帐户。看起来您可能需要求助于pinvoking。可能是调用LsaLookupNames()获取sid,然后调用LsaLookupSids2()获取名称?我现在不在windows机器上,但如果您对pinvoke代码不满意,我可以稍后再试一次。