I want to have a function that can take in any username on the local machine and tell me whether that user is an administator or not. I have tried using WindowsIdentity with no success. Now I am trying to use NetUserGetInfo. The problem is that it always returns 2221. Google tells me thats a user not found error. I'm pretty sure the problem is that I'm using null for the servername. But this is at a workplace with a large network. Users will create accounts on one machine and this code will only run on that. So what should I put for the servername?
[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_1
{
[MarshalAs(UnmanagedType.LPWStr)]
public string usri1_name;
[MarshalAs(UnmanagedType.LPWStr)]
public string usri1_password;
[MarshalAs(UnmanagedType.U4, SizeConst = 34)]
public string usri1_password_age;
[MarshalAs(UnmanagedType.U4, SizeConst = 34)]
public string usri1_priv;
[MarshalAs(UnmanagedType.LPWStr)]
public string usri1_home_dir;
[MarshalAs(UnmanagedType.LPWStr)]
public string usri1_comment;
[MarshalAs(UnmanagedType.U4, SizeConst = 34)]
public string usri1_flags;
[MarshalAs(UnmanagedType.LPWStr)]
public string usri1_script_path;
}
...
public static bool IsAuthorizedUser(string userId)
{
IntPtr bufPtr;
USER_INFO_1 u1 = new USER_INFO_1();
int a = NetUserGetInfo(null, userId, 1, out bufPtr);
if(a == 0)
{
u1 = (USER_INFO_1) Marshal.PtrToStructure(bufPtr, typeof (USER_INFO_1));
Console.WriteLine(u1.usri1_name);
}
else
{
Console.WriteLine("a:"+a);
}