各位大侠!!!    现在一个asp.net 网站不是默认匿名访问的,,是Window验证方式的! 以登录的NT用户来区分每一个用户是谁.
    
    现在要修改当前NT用户的密码?? 在网上查了一些
     DirectoryEntry obDirEntry = new DirectoryEntry("WinNT://" + Environment.MachineName+"/Test");
    obDirEntry.InvokeSet("Password","123456"); //是一种重置密码的方式,而非修密码.(重置别的用户的话,当然要高权限吧)
    obDirEntry.CommitChanges();
    
    但上面方法是要有比较高的权限才可以.这样不行.
    求一种自己修改密码的方式:下面是Asp的修改代码,,,,
   Set oUser = GetObject("WinNT://ComputerName/" & UserName) 
   oUser.ChangePassword OldPwd, NewPwd1 
   oUser.SetInfo 
   Set oUser = Nothing 
    
   用C# 怎么修改当前NT的密码....
   

解决方案 »

  1.   

    我看需要把asp.net 账户添加进超级管理员用户组。
      

  2.   

    //修改NT用户密码
    //传入参数:Username用户名,Userpassword用户新密码
    public static bool InitNTPwd(string Username,string Userpassword)
    {
    try
    {
    DirectoryEntry obComputer = new DirectoryEntry("WinNt://" + Environment.MachineName);
    DirectoryEntry obUser = obComputer.Children.Find(Username,"User");
    obUser.Invoke("SetPassword", Userpassword);
    obUser.CommitChanges();
    obUser.Close();
    obComputer.Close();
    return true;
    }
    catch
    {
    return false;
    }
    }
    }
    }因为需要系统管理员组权限,所以需要进行系统管理员的模拟,就是说你修改之前模拟系统管理员,修改完成后退出模拟
    模拟的实现方式,参考这里面有demo
    http://www.codeproject.com/KB/cs/zetaimpersonator.aspx
      

  3.   

    /// <summary>
            /// 
            /// </summary>
            public const int LOGON32_LOGON_INTERACTIVE = 2;
            /// <summary>
            /// 
            /// </summary>
            public const int LOGON32_PROVIDER_DEFAULT = 0;
            System.Security.Principal.WindowsImpersonationContext impersonationContext;
            /// <summary>
            /// 模拟登录
            /// </summary>
            /// <param name="lpszUserName"></param>
            /// <param name="lpszDomain"></param>
            /// <param name="lpszPassword"></param>
            /// <param name="dwLogonType"></param>
            /// <param name="dwLogonProvider"></param>
            /// <param name="phToken"></param>
            /// <returns></returns>
            [DllImport("advapi32.dll")]
            public static extern int LogonUserA(String lpszUserName,
            String lpszDomain,
            String lpszPassword,
            int dwLogonType,
            int dwLogonProvider,
            ref IntPtr phToken);
            /// <summary>
            /// 摸拟握手
            /// </summary>
            /// <param name="hToken"></param>
            /// <param name="impersonationLevel"></param>
            /// <param name="hNewToken"></param>
            /// <returns></returns>
            [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
            public static extern int DuplicateToken(IntPtr hToken,
            int impersonationLevel,
            ref IntPtr hNewToken);
            /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
            public static extern bool RevertToSelf();
            /// <summary>
            /// 关闭握手句柄
            /// </summary>
            /// <param name="handle"></param>
            /// <returns></returns>
            [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
            public static extern bool CloseHandle(IntPtr handle);  #region 用户摸拟部分
            /// <summary>
            /// 模拟用户名与密码
            /// </summary>
            /// <param name="userName"></param>
            /// <param name="domain"></param>
            /// <param name="password"></param>
            /// <returns></returns>
            private bool impersonateValidUser(String userName, String domain, String password)
            {
                System.Security.Principal.WindowsIdentity tempWindowsIdentity;
                IntPtr token = IntPtr.Zero;
                IntPtr tokenDuplicate = IntPtr.Zero;
                if (RevertToSelf())
                {
                    if (LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE,
                    LOGON32_PROVIDER_DEFAULT, ref token) != 0)
                    {
                        if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
                        {
                            tempWindowsIdentity = new System.Security.Principal.WindowsIdentity(tokenDuplicate);
                            impersonationContext = tempWindowsIdentity.Impersonate();
                            if (impersonationContext != null)
                            {
                                CloseHandle(token);
                                CloseHandle(tokenDuplicate);
                                return true;
                            }
                        }
                    }
                }
                if (token != IntPtr.Zero)
                    CloseHandle(token);
                if (tokenDuplicate != IntPtr.Zero)
                    CloseHandle(tokenDuplicate);
                return false;
            }
            /// <summary>
            /// 取消模拟
            /// </summary>
            private void undoImpersonation()
            {
                impersonationContext.Undo();
            }
            #endregion
      

  4.   

    可不可以不模拟的 ,,,像asp那样的
    Set oUser = GetObject("WinNT://ComputerName/" & UserName) 
      oUser.ChangePassword OldPwd, NewPwd1 
      oUser.SetInfo 
      Set oUser = Nothing 多直接~~~
      

  5.   

    我不知道怎么用.NET修改当前登录用户的密码,而且确实好像也有安全性的问题。但是给你另外一条思路,在IIS5和IIS6里面都有:http://support.microsoft.com/kb/833734
    配置完之后,只要你的站点是"Windows集成认证"的,一旦密码过期就会自动转到修改密码页面,你也可以直接访问修改密码页面: http://localhost/iisadmpwd/aexp3.asphttp://support.microsoft.com/kb/907271
      

  6.   

    你到iis管理工具里面配置不行么
      

  7.   

    呵呵,为什么不大好呢?你只是要一个修改密码的页面而已啊,在你的ASPX里面加个链接就可以了,多方便。
    要是实在不想这么做,那就按照3楼的方法做好了。
      

  8.   


    对阿,所以我给你推荐了我在8楼所说的方法阿,不需要任何权限的特殊设置了。或者,你自己读一下我在8楼里面提到的方法的ASP源码,然后改成ASP.NET。
      

  9.   

    唉~自己搞定了,,obDirEntry.Invoke("ChangePassword", new Object[] { OldPassWord, NewPassWord });
    obDirEntry.CommitChanges();