Как преобразовать objectGuid Active Directory в читаемую строку?
Я использую Novell.Directory.Ldap
в мобильном приложении Xamarin, написанном 9X_ldap на C#.
Используя Novell, я могу аутентифицировать 9X_ldap пользователя на основе домена, имени пользователя 9X_active-directory и пароля, используя
LdapConnection.bind(username, password);
Затем я выполняю поиск, используя 9X_active-directory-group sAMAccountName
, который эквивалентен указанному имени 9X_active-directory пользователя.
После всего этого, что работает 9X_encoding успешно, мне нужно получить пользовательский 9X_active-directory-group objectGuid
, чтобы я мог запрашивать внешние базы данных, которые 9X_mobile используют этот идентификатор в качестве 9X_mobile ключа. Проблема в том, что когда я получаю 9X_encodings руководство обратно из LdapSearchResults
, оно каким-то образом 9X_active-directory-group закодировано. И я не могу понять, как получить 9X_xamarin читаемое строковое представление этого руководства.
У 9X_mobile кого-нибудь есть дополнительная информация 9X_ldap по этому поводу? Я бы предположил, что гид 9X_xamarin как-то закодирован, но как он закодирован, я 9X_encodings не знаю. Я пробовал
System.Convert.FromBase64String
и это не помогло. Я ценю 9X_xamarin помощь, ребята, дайте мне знать, если я 9X_encoding могу опубликовать дополнительную информацию, которая 9X_encoding была бы полезна.
private void Login() { if (LOG.isInfoEnabled()) { LOG.info("Attempting LDAP logon . . ."); if (LOG.isDebugEnabled()) { LOG.debug("Host: " + this.ldapHost); LOG.debug("Port: " + this.ldapPort); LOG.debug("SearchBase: " + this.ldapSearchBase); } } LdapConnection conn = new LdapConnection(); try { conn.Connect(this.ldapHost, this.ldapPort); if (LOG.isDebugEnabled()) { LOG.debug("connected?: " + conn.Connected.ToString()); } } catch (Exception e) { LOG.error("An exception occurred while attempting to connect to AD server!", e); // INFORM USER ABOUT ERROR authError(Resource.String.error_unknown); } if (!string.IsNullOrEmpty(this.editTextUserName.Text) && !string.IsNullOrEmpty(this.editTextPassword.Text)) { // HIDE KEYBOARD var imm = (InputMethodManager)GetSystemService(Context.InputMethodService); imm.HideSoftInputFromWindow(editTextPassword.WindowToken, HideSoftInputFlags.NotAlways); // HIDE 'LOGON' BUTTON WHILE LOGGING ON this.buttonLogin.Visibility = ViewStates.Invisible; try { // PERFORM AUTHENTICATION conn.Bind(this.userName, this.userPassword); if (LOG.isDebugEnabled()) { LOG.debug("conn.Bound?: " + conn.Bound); } if (conn.Bound) { if (LOG.isDebugEnabled()) { LOG.debug("authentication successful"); } string[] name = this.userName.Split('\\'); LOG.debug("name[0]: " + name[0]); LOG.debug("name[1]: " + name[1]); string filter = "(sAMAccountName=" + name[1] + ")"; string guid = ""; LdapSearchResults searchResults = conn.Search( this.ldapSearchBase, // search base LdapConnection.SCOPE_SUB, // search scope filter, // filter null, // attributes false); // attributes only while (searchResults.hasMore()) { LdapEntry nextEntry = null; try { nextEntry = searchResults.next(); guid = nextEntry.getAttribute("objectGUID").StringValue; } catch (LdapException e) { LOG.error("An exception occurred while attempting to get next search result!", e); continue; } } Intent intent = new Intent(this, typeof(DashboardActivity)); intent.PutExtra("guid", guid); StartActivity(intent); } else { // INFORM USER ABOUT ERROR authError(Resource.String.error_auth); } } catch (LdapException ldape) { LOG.error("An exception occurred while attempting to authenticate user credentials!", ldape); // INFORM USER ABOUT ERROR authError(Resource.String.error_auth); } finally { conn.Disconnect(); } } else { conn.Disconnect(); } }
Ответ #1
Ответ на вопрос: Как преобразовать objectGuid Active Directory в читаемую строку?
Я не уверен, что библиотека Novell кодирует 9X_active-directory его каким-либо другим способом, но System.DirectoryServices 9X_encoding предоставляет GUID в виде массива байтов. Вы 9X_mobile можете преобразовать это в читаемую строку 9X_encodings с помощью структуры System.Guid:
new Guid((System.Byte[])this.GUID).ToString()
Ответ #2
Ответ на вопрос: Как преобразовать objectGuid Active Directory в читаемую строку?
ObjectGUID - это двоичная строка (или строка октетов), поэтому 9X_mobile при попытке отобразить значение вы, вероятно, видите 9X_encodings случайные бессмысленные символы.
ObjectGUID фактически 9X_xamarin соответствует устоявшемуся стандарту - это 9X_xamarin UUID version 4. Поскольку я не работаю с C#, я не могу предоставить 9X_xamarin рабочий пример, но с этой информацией вы 9X_xamarin сможете декодировать двоичную строку в читаемое 9X_encodings строковое представление или, по крайней 9X_encodings мере, найти рабочий пример кода. У меня 9X_active-directory-group есть сильное подозрение, что будет какой-то 9X_encodings собственный класс или библиотека для работы 9X_mobile с UUID / Guid в C#.
Если вы не против прочитать 9X_encodings пример php, взгляните на my implementation преобразования 9X_xamarin в php.
Вот рассматриваемая функция. Он ожидает, что 9X_active-directory-group $ guid в исходной двоичной форме будет возвращен 9X_mobile сервером.
function _to_p_guid( $guid ) { $hex_guid = unpack( "H*hex", $guid ); $hex = $hex_guid["hex"]; $hex1 = substr( $hex, -26, 2 ) . substr( $hex, -28, 2 ) . substr( $hex, -30, 2 ) . substr( $hex, -32, 2 ); $hex2 = substr( $hex, -22, 2 ) . substr( $hex, -24, 2 ); $hex3 = substr( $hex, -18, 2 ) . substr( $hex, -20, 2 ); $hex4 = substr( $hex, -16, 4 ); $hex5 = substr( $hex, -12, 12 ); $guid = $hex1 . "-" . $hex2 . "-" . $hex3 . "-" . $hex4 . "-" . $hex5; return $guid; }
- Я обновил ссылку (недавно я немного перем ...
Ответ #3
Ответ на вопрос: Как преобразовать objectGuid Active Directory в читаемую строку?
В библиотеке Novell objectGUID
- это массив SByte
, который 9X_xamarin необходимо преобразовать в массив Byte
перед 9X_active-directory преобразованием в GUID
. Вам также необходимо 9X_encodings получить ByteValue
из objectGUID
, а не StringValue
.
try { nextEntry = searchResults.next(); guid = new Guid((Byte[])(Array)nextEntry.getAttribute("objectGUID").ByteValue); } catch (LdapException e) { LOG.error("An exception occurred while attempting to get next search result!", e); continue; }
-
9
-
6
-
8
-
3
-
5
-
7
-
4
-
9
-
3
-
2
-
5
-
4
-
4
-
4
-
5
-
2
-
8
-
3
-
5
-
2
-
2
-
3
-
1
-
5
-
3
-
1
-
2
-
3
-
3
-
6
-
4
-
3
-
3
-
4
-
1
-
3
-
4
-
2
-
3
-
2
-
4
-
2
-
1
-
3
-
1
-
3
-
1
-
6
-
1
-
1