ローカルマシン上の任意のユーザー名を取り込んで、そのユーザーが管理者かどうかを教えてくれる機能が欲しいのですが。WindowsIdentityを使用しようとしましたが、成功しませんでした。今、私はNetUserGetInfoを使おうとしています。問題は、常に2221を返すことです。Googleは、ユーザーが見つからないというエラーを通知します。問題は、サーバー名にnullを使用していることだと確信しています。しかし、これは大規模なネットワークのある職場です。ユーザーは1台のマシンでアカウントを作成し、このコードはそのマシンでのみ実行されます。では、サーバー名には何を入力する必要がありますか?
[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);
}