2012-07-02 4 views
1

Я хочу использовать http://msdn.microsoft.com/en-us/library/aa370654%28VS.85%29.aspx в моем коде. Но по какой-то причине я не могу найти, какое пространство имен использовать для этого. Три, которые, как я думал, будут работать, -Можно ли использовать NetUserGetInfo в C#?

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

Но ни одна из этих работ не работает. Все примеры использования NetUserGetInfo, которые я могу найти, находятся на C++, а не на C#. Это заставляет меня думать, что, возможно, я не могу использовать его в C#. Могу я? И если да, то какое пространство имен я должен использовать для доступа к функции NetUserGetInfo? Любая помощь приветствуется.

ответ

3

Какое пространство имен вы хотите? Пространства имен - это специфичные для .NET понятия. NetUserGetInfo - неуправляемая функция Win32. Если вы хотите вызвать его из управляемого кода .NET, вам нужно написать управляемую оболочку и вызвать ее через P/Invoke.

Вот в этом случае, который иллюстрирует следующую управляемую обертку useful site:

[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; 
    } 
} 
2

NetUserGetInfo является API Win32, который должен быть P/вызван. При использовании .NET лучше использовать API-интерфейс .NET diectory. Класс UserPrincipal, вероятно, является хорошей отправной точкой.

Смежные вопросы