2011-02-08 13 views
1

64bit Windows 7マシンにC#winformアプリケーションをインストールすると、(ローカルマシンの)ユーザーアカウント名を取得できません。 32bit Windows 7、64bit VIsta、32bit Vista、XPで正しく動作します。64bit Windows 7でユーザーアカウント名を取得できない

"DirectoryEntry admGroup = localMachine.Children.Find ..."というエラーが発生し、コードが "System.Runtime.InteropServices.COMException [0x800708ac]"というエラーで失敗します。グループ名が見つかりませんでした。

(他のすべてのオペレーティングシステムでも機能する)64ビットWindows 7で動作するようにするために、コードにどのような変更を加えることができますか?

注1: "DirectoryEntry localMachine = new DirectoryEntry ..."という行は正しくマシン名を取得します。

注2:わかりやすくするために、「[適用名]」に置き換えて文字列を短縮しました。 「[APLICATION NAME] .ResourceAdmin.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.DirectoryServicesPermission(System.Security.Permissions.PermissionState.Unrestricted)。 permission.Assert();これについて

答えて

0

方法:

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

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

}

そして、彼らと一緒にものを行う方法を学習する方法と2クラスのメンバーを見てみましょう。 DirectoryEntryクラスよりもこれらを使用するほうがずっと簡単です.LDAP文字列はありません。

+0

はい、これは私の提案でもあり、ldapコードを取り除き、DirectoryServicesで置き換えると、使いやすくなりました – Alex

+0

@chad:私のコードにあなたの提案を組み込むのが難しいです。 "myNewAccount"と "myPass"で何をしますか?私はこれらの文字列をそのまま残していますか? – Frederick

関連する問題