我有一个WindowsIdentity,它对应于经过身份验证的用户。如何确定标识是否与计算机上的本地用户,已添加到计算机的域用户或未添加到计算机的域相对应?
让我们说我有3个用户帐户:
我如何区分
截至目前,我依赖于用户名并检查它是否以机器名称开头。然后,我通过检查用户所属的组(如果它是所有域用户的一部分)进一步区分。不是我确定的最佳方式。
由于我有来自WindowsIdentity.User属性的用户sid,我可以以某种方式使用它吗?
答案 0 :(得分:6)
不确定映射域管理员。 我只检查用户登录的域的本地和域管理员。 不要访问像“builtin \ Admin”这样的字符串,它们根据操作系统语言版本而不同。
我喜欢使用.net 4.5 Principals方法。 如果你可以使用4.5
,你可以做类似的事情关于这个问题 我如何区分
示例代码
using System;
using System.DirectoryServices.ActiveDirectory;
using System.Security.Principal
namespace xxxxx
{
public class UserEnvTools
{
public static bool IsDomainAdmin()
{ //returns TRUE for a machine that is on a workgroup So consider GetDomain methods based on scenario
if (WindowsIdentity.GetCurrent().User.AccountDomainSid == null)
return false;
var domainAdmins = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid,
WindowsIdentity.GetCurrent().User.AccountDomainSid);
var prin = new WindowsPrincipal(WindowsIdentity.GetCurrent());
return prin != null && (prin.IsInRole(domainAdmins));
}
public static bool IsDomainUser()
{
//returns TRUE for a machine that is on a workgroup So consider GetDomain methods based on scenario
if (WindowsIdentity.GetCurrent().User.AccountDomainSid == null)
return false;
var domainUsers = new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid,
WindowsIdentity.GetCurrent().User.AccountDomainSid);
var prin = new WindowsPrincipal(WindowsIdentity.GetCurrent());
return prin != null && (prin.IsInRole(domainUsers));
}
public static bool IsLocalAdmin()
{
var localAdmins = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null);
var prin = new WindowsPrincipal(WindowsIdentity.GetCurrent());
return prin != null && (prin.IsInRole(localAdmins));
}
public static bool IsLocalUser()
{
var localUsers = new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null);
var prin = new WindowsPrincipal(WindowsIdentity.GetCurrent());
return prin != null && (prin.IsInRole(localUsers));
}
// Current security context applies
public static Domain GetCurrentUserDomain()
{
try
{
return System.DirectoryServices.ActiveDirectory.Domain.GetCurrentDomain();
}
// It may be better not to ctach such errors?
catch (ActiveDirectoryOperationException) // no Controller/AD Forest can not be contacted
{return null;}
catch (ActiveDirectoryObjectNotFoundException) // The USers Domain is not known to the controller
{return null;}
}
public static Domain GetCurrentMachineDomain()
{
try
{
return System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain();
}
// It may be better not to ctach such errors?
catch (ActiveDirectoryOperationException) // no controller or machine is not on a domain
{ return null; }
catch (ActiveDirectoryObjectNotFoundException) // controller found, but the machine is not known
{ return null; }
}
答案 1 :(得分:0)
假设WindowsIdentity.Name
的工作方式与Environment.UserDomainName
类似,如果用户名以机器名开头,那么它不在域上,否则就在域上。这允许你写
public static bool IsDomain(WindowsIdentity identity)
{
string prefix = identity.Name.Split('\\')[0];
if (prefix != Environment.MachineName)
return true;
else
return false;
}
UserDomainName属性首先尝试获取域名 当前用户的Windows帐户名的组件。如果说 尝试失败,此属性尝试获取域名 与UserName属性提供的用户名关联。如果 该尝试失败,因为主机未加入 域,然后返回主机名。
您还可以针对计算机名称和域名相同的边缘情况筛选可用域列表(例如,存储在数据库中)。