C# 获取64位Windows 7的用户帐户名失败

C# 获取64位Windows 7的用户帐户名失败,c#,winforms,directoryentry,C#,Winforms,Directoryentry,当安装在64位Windows 7计算机上时,我的C winform应用程序无法获取本地计算机的用户帐户名。它可以在32位Windows7、64位VIsta、32位VIsta和XP上正常工作 代码在DirectoryEntry admGroup=localMachine.Children.Find行失败。。。错误为System.Runtime.InteropServices.COMException[0x800708ac]。找不到组名 我可以对代码进行哪些更改,使其适用于64位Windows 7,

当安装在64位Windows 7计算机上时,我的C winform应用程序无法获取本地计算机的用户帐户名。它可以在32位Windows7、64位VIsta、32位VIsta和XP上正常工作

代码在DirectoryEntry admGroup=localMachine.Children.Find行失败。。。错误为System.Runtime.InteropServices.COMException[0x800708ac]。找不到组名

我可以对代码进行哪些更改,使其适用于64位Windows 7,该操作系统也适用于所有其他操作系统

注1:行DirectoryEntry localMachine=newdirectoryEntry。。。正确获取计算机名

注2:为了简单起见,我通过在[APLICATION NAME]中替换来缩短字符串。使用[Application NAME].ResourceAdmin.administrators或administrators时,代码的执行方式相同

        #region Get Windows User Accounts
        private void GetWindowsUser()
        {
            DataSet dsWindowsUser = null;
            try
            {
                //Retrieve machine name.
                DirectoryEntry localMachine = new DirectoryEntry([APLICATION NAME].ResourceAdmin.WiinNT + Environment.MachineName);

//CODE FAILS ON THE NEXT LINE
                DirectoryEntry admGroup = localMachine.Children.Find([APLICATION NAME].ResourceAdmin.administrators, [APLICATION NAME].ResourceAdmin.group);
             // DirectoryEntry admGroup = localMachine.Children.Find("administrators", "group");  //TEST CODE           

                object adminmembers = admGroup.Invoke([APLICATION NAME].ResourceAdmin.members, null);
             // object adminmembers = admGroup.Invoke("members", null);  //TEST CODE    

                DirectoryEntry userGroup = localMachine.Children.Find([APLICATION NAME].ResourceAdmin.Users, [APLICATION NAME].ResourceAdmin.group);
                object usermembers = userGroup.Invoke([APLICATION NAME].ResourceAdmin.members, null);

                //Create datatable to store windows user.
                DataTable dtWindowsUser = new DataTable();
                DataRow drow;

                //Create datatable to add user
                DataColumn myDataColumn;
                myDataColumn = new DataColumn();
                myDataColumn.DataType = Type.GetType("System.String");
                myDataColumn.ColumnName = "WindowsUser";

                //Add column to datatable
                dtWindowsUser.Columns.Add(myDataColumn);

                //Retrieve each user name.
                foreach (object groupMember in (IEnumerable)adminmembers)
                {
                    DirectoryEntry member = new DirectoryEntry(groupMember);
                    if (!(member.Name == "admin" || member.Name == "Domain Admins"))
                    {
                        drow = dtWindowsUser.NewRow();
                        drow["WindowsUser"] = member.Name;

                        //Add row to datatable
                        dtWindowsUser.Rows.Add(drow);
                    }
                }
                foreach (object groupMember in (IEnumerable)usermembers)
                {
                    DirectoryEntry member = new DirectoryEntry(groupMember);
                    if (!(member.Name == "ACTUser" || member.Name == "ASPNET" || member.Name == "Domain Users" || member.Name == "Authenticated Users" || member.Name == "INTERACTIVE" || member.Name == "SQLDebugger"))
                    {
                        drow = dtWindowsUser.NewRow();
                        drow["WindowsUser"] = member.Name;

                        //Add row to datatable
                        dtWindowsUser.Rows.Add(drow);
                    }
                }
                dsWindowsUser = new DataSet();
                dsWindowsUser.Tables.Add(dtWindowsUser);

                //Add User to database
                objAdminDAO.AddUpdateUserInfo(dsWindowsUser);
            }
            catch (Exception ex)
            {
                BusinessObject.Logger.Logger.Log(ex);
            }
            finally
            {
                if (!(dsWindowsUser == null))
                {
                    dsWindowsUser.Dispose();
                }
            }
        }
编辑:对于另一个博客站点上的类似问题,建议在失败的DirectoryEntry语句之前添加此代码。我试过了,但没用

System.DirectoryServices.DirectoryServicesPermission 权限=新建 System.DirectoryServices.DirectoryServicesPermissionSystem.Security.Permissions.PermissionState.Unrestricted; 允许。断言

这个怎么样:

using(PrincipalContext ctx = new PrincipalContext(ContextType.Machine)) {

      UserPrincipal userPrincipal = new UserPrincipal(ctx, "myNewAccount", "myPass", true);
}


然后看看这两个类的方法和成员,学习如何使用它们。使用它们比使用DirectoryEntry类要容易得多-没有LDAP字符串

是的,这也是我的建议,为了摆脱ldap代码并用DirectoryServices替换它,更容易use@chad当前位置我很难将您的建议合并到我的代码中。我如何处理我的新帐户和我的通行证?我要保留这些字符串吗?