1

コードでhttp://msdn.microsoft.com/en-us/library/aa370654%28VS.85%29.aspxを使用したいと思います。しかし、何らかの理由で、使用する名前空間が見つかりません。私がうまくいくと思った3つは

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

しかし、これらはどれも機能しません。私が見つけたNetUserGetInfoの使用例はすべて、C#ではなくC++です。そのため、C#では使用できないのではないかと思います。できますか?もしそうなら、NetUserGetInfo関数にアクセスするためにどの名前空間を使用する必要がありますか?どんな助けでも大歓迎です。

4

2 に答える 2

3

どの名前空間を探していますか?名前空間は.NET固有の概念です。これNetUserGetInfo はWin32アンマネージ関数です。マネージド.NETコードから呼び出す場合は、マネージドラッパーを記述し、P/Invokeを介して呼び出す必要があります。

この場合の便利なサイトは、次のマネージラッパーを示しています。

[DllImport("Netapi32.dll", CharSet=CharSet.Unicode, ExactSpelling=true)]
private extern static int NetUserGetInfo(
    [MarshalAs(UnmanagedType.LPWStr)] string ServerName,
    [MarshalAs(UnmanagedType.LPWStr)] string UserName, 
    int level, 
    out IntPtr BufPtr
);

ユーザー定義の構造:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct USER_INFO_10
{
    [MarshalAs(UnmanagedType.LPWStr)]
    public string usri10_name;
    [MarshalAs(UnmanagedType.LPWStr)]
    public string usri10_comment;
    [MarshalAs(UnmanagedType.LPWStr)]
    public string usri10_usr_comment;
    [MarshalAs(UnmanagedType.LPWStr)]
    public string usri10_full_name;
}

およびサンプル呼び出し:

public bool AccountGetFullName(string MachineName, string AccountName, ref string FullName) 
{
    if (MachineName.Length == 0 ) 
    {
        throw new ArgumentException("Machine Name is required");
    }
    if (AccountName.Length == 0 ) 
    {
        throw new ArgumentException("Account Name is required");
    }
    try 
    {
        // Create an new instance of the USER_INFO_1 struct
        USER_INFO_10 objUserInfo10 = new USER_INFO_10();
        IntPtr bufPtr; // because it's an OUT, we don't need to Alloc
        int lngReturn = NetUserGetInfo(MachineName, AccountName, 10, out bufPtr ) ;
        if (lngReturn == 0) 
        {
            objUserInfo10 = (USER_INFO_10) Marshal.PtrToStructure(bufPtr, typeof(USER_INFO_10) );
            FullName = objUserInfo10.usri10_full_name;
        }
        NetApiBufferFree( bufPtr );
        bufPtr = IntPtr.Zero;
        if (lngReturn == 0 ) 
        {
            return true;
        }
        else 
        {
            //throw new System.ApplicationException("Could not get user's Full Name.");
            return false;
        }
    } 
    catch (Exception exp)
    {
        Debug.WriteLine("AccountGetFullName: " + exp.Message);
        return false;
    }
}
于 2012-07-02T13:18:40.890 に答える
2

NetUserGetInfoP/Invokedが必要なWin32APIです。.NETを使用する場合は、.NET diectoryservicesAPIを使用することをお勧めします。UserPrincipalクラスはおそらく良い出発点です

于 2012-07-02T13:19:49.010 に答える