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();これについて
はい、これは私の提案でもあり、ldapコードを取り除き、DirectoryServicesで置き換えると、使いやすくなりました – Alex
@chad:私のコードにあなたの提案を組み込むのが難しいです。 "myNewAccount"と "myPass"で何をしますか?私はこれらの文字列をそのまま残していますか? – Frederick