windows - Kontroller, om brugernavnet er i administratorgruppen

Indlæg af Hanne Mølgaard Plasc

Problem



I et InstallShield-grundlæggende MSI-projekt: Hvordan kan jeg kontrollere, om et brugernavn er i administratorgruppen? [2] [3]


(Ikke den nuværende bruger, som jeg ved det er muligt at gøre).

Bedste reference


Du kan køre 'net localgroup administratorer' og analysere output. Jeg formoder, at der er en bedre måde, men hvis ikke ...

Andre referencer 1


Brugere kan tilhøre gruppen 'Administratorer' på den lokale server eller kunne være en del af gruppen 'Domain Admins' eller 'Enterprise Admins' defineret i din AD. Ideel løsning ville være at oprette en DLL med en metode kaldet IsUserAdmin (user\_name), der indtaster et brugernavn parameter og returnerer enten true eller false.


Internt kalder metoden IADsUser :: Groups-metoden til at bestemme de grupper, som den medleverede bruger tilhører, og vil returnere sandt, hvis grupperne opregnes tilhører en af ​​disse administratorgrupper ovenfor. Hvis ikke, vil det vende tilbage falsk. Du kan påberåbe denne DLL i dine InstallShield-projekter. Vær forsigtig med indlejrede grupper.

Andre referencer 2


Jeg kan tænke på to tilgange, men hver især indebærer at skrive kode over og over dit installations script, jeg er ikke bekendt med Installshield mere, men formodentlig ligesom Visual Studio setup projekter har du begrebet brugerdefinerede handlinger. Jeg formoder det er hvad du skal bruge.


Jeg vil kun skitsere den første, fordi den anden er ret kompleks (dvs. endnu mere kompleks end den første!). Den indlysende tilgang er AD. Følgende kodestykke vil fortælle dig om en kombination af brugernavn/adgangskode eksisterer. Jeg er sikker på at du kan finde ud af, hvilke grupper de er i.


if (true == String.IsNullOrEmpty(userName)) throw new Exception("userName not set");

DirectoryEntry entry = new DirectoryEntry();
entry.Username = userName;  // Use the fully qualified name here
entry.Password = password;

string DomainlessUsername = userName.Substring(userName.LastIndexOf('\') + 1, userName.Length - userName.LastIndexOf('\') - 1);

// We know straight away that if this is empty, we've drawn a blank!
if (true == String.IsNullOrEmpty(DomainlessUsername)) throw new Exception("userName not set");

DirectorySearcher search = new DirectorySearcher(entry);
search.Filter = "(SAMAccountName=" + DomainlessUsername + ")";
search.PropertiesToLoad.Add("cn");

SearchResult result = search.FindOne();

if (null == result)
{
    throw new Exception("FindOne executed without exception, but result was null");
}
else
{
    // some logging here
}
return true;


Nu er der et potentielt problem her, hvis den konto, der kører denne kode, ikke har rettigheder til at få adgang til AD. Jeg vandt ikke i detaljer i dette indlæg, fordi forhåbentlig koden ovenfor vil være nok til at hjælpe dig, men det grundlæggende princip i den alternative tilgang er at shell ud direkte til advapi32.dll til funktioner som LogonUser. (Husk at igen , mit problem var at validere legitimationsoplysninger, der ikke kontrollerede for administratorrettigheder, men der er nok et link der, hvis du er parat til at grave).


Håber noget af dette hjælper!