我想在我的代码中使用http://msdn.microsoft.com/en-us/library/aa370654%28VS.85%29.aspx。但由于某种原因,我找不到要使用的命名空间。我认为可行的三个是
using System.DirectoryServices.AccountManagement;
using System.Runtime.InteropServices;
using System.DirectoryServices;
但这些都不起作用。我可以找到的所有使用NetUserGetInfo的例子都是用C ++编写的,而不是C#。这让我觉得也许我不能在C#中使用它。我可以吗?如果是这样,我应该使用什么命名空间来访问NetUserGetInfo函数?任何帮助表示赞赏。
答案 0 :(得分: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;
}
}
答案 1 :(得分:2)
NetUserGetInfo
是需要P / Invoked的Win32 API。使用.NET时,最好使用.NET diectory服务API。 UserPrincipal课程可能是一个很好的起点。