Domanda

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);
        }
È stato utile?

Soluzione

First you need to know what you are doing. How do you define administrator? There is a local group call Administrators -- this is often what people mean when they talk about administrator for a given machine. Is this what you mean?

You could also mean an administrator on the domain. If this is the case then you need to know where the domain is hosted. This is the server it is asking for. If you don't have or know what this is then you probably don't need it.

In any case this is probably the answer to your un-spoken question:

In .NET/C# test if process has administrative privileges

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top