3

コンピュータ名のリストと、それらが最後にログオンした日付を Active Directory から取得し、データテーブルで返そうとしています。名前を取得するのは簡単ですが、以下に示すように「lastLogon」または「lastLogonTimestamp」を追加しようとすると、lastLogonTimestamp に対して取得する値は「System._ComObject」だけです。

public DataTable GetListOfComputers(string domainName)
{
  DirectoryEntry entry = new DirectoryEntry("LDAP://DC=" + domainName + ",DC=com");
  DirectorySearcher search = new DirectorySearcher(entry);
  string query = "(objectclass=computer)";
  search.Filter = query;

  search.PropertiesToLoad.Add("name");
  search.PropertiesToLoad.Add("lastLogonTimestamp");

  SearchResultCollection mySearchResultColl = search.FindAll();

  DataTable results = new DataTable();
  results.Columns.Add("name");
  results.Columns.Add("lastLogonTimestamp");

  foreach (SearchResult sr in mySearchResultColl)
  {
    DataRow dr = results.NewRow();
    DirectoryEntry de = sr.GetDirectoryEntry();
    dr["name"] = de.Properties["Name"].Value;
    dr["lastLogonTimestamp"] = de.Properties["lastLogonTimestamp"].Value;
    results.Rows.Add(dr);
    de.Close();
  }

  return results;
}

LDP などのツールを使用して AD にクエリを実行すると、プロパティが存在し、データが入力されていることがわかります。どうすればこの情報を入手できますか?

4

4 に答える 4

11

System.DirectoryServices.AccountManagementのComputerPrincipalクラスとPrincipalSearcherを使用する方が簡単です。

PrincipalContext pc = new PrincipalContext(ContextType.Domain, domainName);
PrincipalSearcher ps = new PrincipalSearcher(new ComputerPrincipal(pc));
PrincipalSearchResult<Principal> psr = ps.FindAll();
foreach (ComputerPrincipal cp in psr)
{
    DataRow dr = results.NewRow();
    dr["name"] = cp.Name;
    dr["lastLogonTimestamp"] = cp.LastLogon;    
    results.Rows.Add(dr);
}
于 2009-10-21T17:22:45.773 に答える
6

**DirectoryEntryから取得したプロパティ'lastLogonTimestamp'を処理する方法は、それをIADSLargeIntegerに変換することです。

差出人:http : //www.dotnet247.com/247reference/msgs/31/159934.aspx **

これらのタイプに対して返される__ComObjectは、数値の場合はIADsLargeIntegerであり、SecurityDescriptorsの場合はIADsSecurityDescriptorです。

[COM]タブにActiveDSType Libへの参照を含めて、これらのインターフェイスの定義を取得するか、手動で定義することができます。サンプルは次のとおりです。

using System;
using System.DirectoryServices;
using System.Runtime.InteropServices;

//This is the managed definition of this interface also found in
ActiveDs.tlb
[ComImport]
[Guid("9068270B-0939-11D1-8BE1-00C04FD8D503")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
internal interface IADsLargeInteger
{
    [DispId(0x00000002)]
    int HighPart{get; set;}
    [DispId(0x00000003)]
    int LowPart{get; set;}
}

class Class1
{
    [STAThread]
    static void Main(string[] args)
    {
        DirectoryEntry entry = new
DirectoryEntry("LDAP://cn=user,cn=users,dc=domain,dc=com");
        if(entry.Properties.Contains("lastLogon"))
        {
            IADsLargeInteger li =
(IADsLargeInteger)entry.Properties["lastLogon"][0];    
            long date = (long)li.HighPart << 32 | (uint)li.LowPart;
            DateTime time = DateTime.FromFileTime(date);
            Console.WriteLine("Last logged on at: {0}", time);
        }
    }

}

DavidStuckiMicrosoft開発者サポート

于 2012-03-27T14:54:49.930 に答える
3

IADsLargeInteger ( Source )を使用してみてください

DirectoryEntry user = DirectoryEntry("LDAP://" + strDN);
if (user.Properties.Contains("lastlogontimestamp"))
{
  // lastlogontimestamp is a IADsLargeInteger
  IADsLargeInteger li = (IADsLargeInteger) 
  user.Properties["lastlogontimestamp"][0];
  long lastlogonts = 
      (long)li.HighPart << 32 | (uint)li.LowPart;
  user.Close();
  return DateTime.FromFileTime(lastlogonts);
}
于 2009-10-21T16:49:58.217 に答える
1

元の質問に対する簡単な答えは、検索結果のプロパティにアクセスすることです。

sr.Properties["lastLogonTimestamp"][0].ToString()

DateTime.FromFileTimeUTC(long.Parse(sr.Properties["lastLogonTimestamp"][0].ToString()))日時値を取得する

私は同様の問題を抱えています。 のlastLogonTimestampプロパティにアクセスSearchResultして、インデックス付きの結果の値を取得できますが、使用した後、 DirectoryEntryのプロパティSearchResult.GetDirectoryEntry()の有効な結果にアクセスできません。lastLogonTimestamp

プロパティへのアクセスに関連してDirectoryEntry返された fromで、他の誰かがこの問題に遭遇しましたか?SearchResult.GetDirectoryEntry()lastLogonTimestamp

于 2012-03-27T13:08:56.823 に答える