static UserPrincipal lookup(String name) throws IOException { SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkPermission(new RuntimePermission("lookupUserInformation")); } // invoke LookupAccountName to get buffer size needed for SID int size = 0; try { size = LookupAccountName(name, 0L, 0); } catch (WindowsException x) { if (x.lastError() == ERROR_NONE_MAPPED) throw new UserPrincipalNotFoundException(name); throw new IOException(name + ": " + x.errorString()); } assert size > 0; // allocate buffer and re-invoke LookupAccountName get SID NativeBuffer sidBuffer = NativeBuffers.getNativeBuffer(size); try { int newSize = LookupAccountName(name, sidBuffer.address(), size); if (newSize != size) { // can this happen? throw new AssertionError("SID change during lookup"); } // return user principal return fromSid(sidBuffer.address()); } catch (WindowsException x) { throw new IOException(name + ": " + x.errorString()); } finally { sidBuffer.release(); } }
static UserPrincipal fromSid(long sidAddress) throws IOException { String sidString; try { sidString = ConvertSidToStringSid(sidAddress); if (sidString == null) { // pre-Windows XP system? throw new AssertionError(); } } catch (WindowsException x) { throw new IOException("Unable to convert SID to String: " + x.errorString()); } // lookup account; if not available then use the SID as the name Account account = null; String name; try { account = LookupAccountSid(sidAddress); name = account.domain() + "\\" + account.name(); } catch (WindowsException x) { name = sidString; } int sidType = (account == null) ? SidTypeUnknown : account.use(); if ((sidType == SidTypeGroup) || (sidType == SidTypeWellKnownGroup) || (sidType == SidTypeAlias)) // alias for local group { return new Group(sidString, sidType, name); } else { return new User(sidString, sidType, name); } }