none
如何区分用户是登录到AD域还是登录到本机呢? RRS feed

  • 问题

  • 我用C#在做一个客户端的程序,需要判断当前windows 用户是以那种方式登录进来的。

    我能够知道的两种方式就是:

    1、登录到AD域

    2、普通登录,即登录到本机



    请问在C#里面有什么方法可以获知这个状态?

    用WindowsIdentity.AuthenticationType来判断是否可行?因为我调试发现,登录到本机的时候,AuthenticationType等于“NTLM”,而登录到AD域的时候,AuthenticationType等于“Kerberos”

    另外,如果我不在AD域的局域网下(例如回到家用ADSL上网,或者干脆就没有网络的情况下),也可以登录到AD域,请问此时是否可以区分出来?

    	if(tx!=null)
    	{
    		if(tx.rows.length>1)
    		{
    			for(var i=1;i<tx.rows.length;i++)
    			{
    				if(tx.rows[i].cells[1].innerText.toLowerCase()==n.toLowerCase())
    					return tx.rows[i].cells[3].getAttribute("FieldProperty");
    			}
    		}
    	}
    


    da jia hao!
    • 已编辑 liubin 2012年9月27日 11:23
    2010年10月17日 8:50

答案

  • AuthenticationType 只是表示验证的方式。NTLM 和 Kerbos 是 Windows 验证的两种提供器,不可以用来进行判断是否登录 AD/本机。

    此外,Windows 目前都支持脱机域登录,所以,以我所见,要判断是否在域里面,除了 IsAuthenticated = true 之外,还要手动去连接一次 AD DC 看看是否成功。这样才能保证其万无一失。

    登录到本机的话,用户名和登录到域时是不一样的,这个很容易区分。关键问题是我说的,在脱机连接到域的情况下,需要手动去检查域控制器的连接状态。


    Mark Zhou
    2010年10月18日 8:30
  • 我给出一些步骤以便帮助您解决问题。

    1、检查 WindowsPrincipal.IsAuthenticated,如果为 true,进行下一步。
    2、检查 WindowsPrincipal.Identity.Name,不是以本机名开头的并且不为空,下一步。
    3、利用 PrincipalContext (System.DirectoryService.AccountManagement.dll) 建立一个当前域连接,然后随便找一个域对象,如 DOMAIN ADMIN,利用 UserPrincipal.FindByIdentity() 方法找一个 AD 对象。如果没有任何异常,下一步。
    4、检查其 Sid 属性,如果不是空,证明此时,当前用户已经登录到域。

    任何一步失败,都表示当前用户没有登录到域,准确的说是没有联机登录到域。


    Mark Zhou
    2010年10月19日 10:12

全部回复

  • AuthenticationType 只是表示验证的方式。NTLM 和 Kerbos 是 Windows 验证的两种提供器,不可以用来进行判断是否登录 AD/本机。

    此外,Windows 目前都支持脱机域登录,所以,以我所见,要判断是否在域里面,除了 IsAuthenticated = true 之外,还要手动去连接一次 AD DC 看看是否成功。这样才能保证其万无一失。

    登录到本机的话,用户名和登录到域时是不一样的,这个很容易区分。关键问题是我说的,在脱机连接到域的情况下,需要手动去检查域控制器的连接状态。


    Mark Zhou
    2010年10月18日 8:30
  • 那请问如何连接AD去判断用户是否真真正正登录到域呢?
    da jia hao!
    2010年10月19日 7:33
  • 我给出一些步骤以便帮助您解决问题。

    1、检查 WindowsPrincipal.IsAuthenticated,如果为 true,进行下一步。
    2、检查 WindowsPrincipal.Identity.Name,不是以本机名开头的并且不为空,下一步。
    3、利用 PrincipalContext (System.DirectoryService.AccountManagement.dll) 建立一个当前域连接,然后随便找一个域对象,如 DOMAIN ADMIN,利用 UserPrincipal.FindByIdentity() 方法找一个 AD 对象。如果没有任何异常,下一步。
    4、检查其 Sid 属性,如果不是空,证明此时,当前用户已经登录到域。

    任何一步失败,都表示当前用户没有登录到域,准确的说是没有联机登录到域。


    Mark Zhou
    2010年10月19日 10:12
  • 我给出一些步骤以便帮助您解决问题。

    1、检查 WindowsPrincipal.IsAuthenticated,如果为 true,进行下一步。
    2、检查 WindowsPrincipal.Identity.Name,不是以本机名开头的并且不为空,下一步。
    3、利用 PrincipalContext (System.DirectoryService.AccountManagement.dll) 建立一个当前域连接,然后随便找一个域对象,如 DOMAIN ADMIN,利用 UserPrincipal.FindByIdentity() 方法找一个 AD 对象。如果没有任何异常,下一步。
    4、检查其 Sid 属性,如果不是空,证明此时,当前用户已经登录到域。

    任何一步失败,都表示当前用户没有登录到域,准确的说是没有联机登录到域。


    Mark Zhou

    很专业的答案,谢谢了。
    da jia hao!
    2011年4月5日 17:42