AD 조직 구조 (Organizational Unit) 의 나무 구 조 를 구성 하 는 또 다른 방법
8003 단어 xmlunitOrganizational
using System.DirectoryServices;
using System.DirectoryServices.ActiveDirectory;
트 리 노드 클래스 정의:
public class OuTreeNode
{
public string Name { get; set; }
public string Id { get; set; }
private List<OuTreeNode> _children = new List<OuTreeNode>();
public List<OuTreeNode> Children
{
get { return _children; }
set { _children = value; }
}
}
이런 종류의 이름 은 OuTreeNode 입 니 다. 그 중에서 OU 노드 의 기본 정 보 를 저장 합 니 다. 여기 서 OU 의 name, id, 하위 노드 의 목록 을 정의 합 니 다.이전에 재 귀적 으로 OU 를 찾 는 방법 과 달리 이 방법 은 조 회 를 사용 하여 모든 OU 를 한 번 에 조회 한 다음 에 이 OU 를 옮 겨 다 니 면 조직 구조 트 리 를 만 들 수 있다.기본 적 인 사고방식 은 OU 대상 의 distinguishedName 을 이용 하여 OU 가 루트 노드 에 대한 상대 적 인 경 로 를 구성 하 는 것 이다. 이 경 로 는 xml 표 의 xpath 로 서 이 xpath 에 따라 xml 를 구성 할 수 있 고 마지막 으로 xml 표를 통 해 OU 트 리 를 재 귀적 으로 구성 할 수 있다.이것 은 xml 조회 에 대한 역방향 응용 입 니 다. 일반적으로 xml 표를 지정 하고 xpath 를 사용 하여 그 중의 노드 를 조회 합 니 다. 이번 에는 xpath 를 사용 하여 xml 표를 구성 합 니 다.
우선 OU 의 distinguished Name 을 상대 경로 로 변환 하 는 방법 이 필요 합 니 다.
private static string FormatDNToRelativePath(string rawDn)
{
StringBuilder path = new StringBuilder();
rawDn = rawDn.Replace(" ", "_").Replace("&", "_");
string[] dnParts = rawDn.Split(new[] { ',' });
foreach (string part in dnParts)
{
if (part.StartsWith("OU", StringComparison.OrdinalIgnoreCase))
{
string name = XmlConvert.EncodeName((part.Split(new char[] {'='})[1]));
path.Insert(0, string.Format("/{0}", name));
}
}
string domainName = string.Empty;
using (Domain root = Domain.GetCurrentDomain())
{
domainName = root.Name;
}
path.Insert(0, string.Format("{0}", domainName));
return path.ToString();
}
이 방법 은 "OU = Office 1, OU = Dev Department, DC = Test, DC = com" 과 같은 상대 경 로 를 Test. Com \ Dev Department \ \ Office 1 과 같이 xml 표 에 의 해 OU 트 리 를 구성 할 수 있 습 니 다. 문자 전의 문제 가 있 습 니 다. AD 에서 OU 의 이름 은 임의의 문 자 를 사용 할 수 있 지만 xml 이 안 되 므 로 OU 의 이름 을 전의 해 야 합 니 다.XmlConvert. EncodeName 방법 을 사용 하여 이 를 한 다음 트 리 를 구성 할 때 다시 의 미 를 바 꿉 니 다.최종 사용자 에 게 보 여 주 려 면 OU 의 정 보 를 가 져 와 야 합 니 다. 예 를 들 어 OU 의 name 과 id 만 가 져 옵 니 다. 그 중에서 name 도 전의 가 필요 합 니 다. name 은 xml 의 속성 으로 저장 되 기 때 문 입 니 다.
private static string GetName(DirectoryEntry entry)
{
return XmlConvert.EncodeLocalName(entry.Properties["name"].Value.ToString());
}
private static string GetId(DirectoryEntry entry)
{
byte[] bytes = entry.Properties["ObjectGuid"].Value as byte[];
Guid id = new Guid(bytes);
return id.ToString();
}
그 다음 에 모든 OU 의 상대 적 인 경로 와 이 OU 의 부모 노드 의 상대 적 인 경 로 를 얻 을 수 있 습 니 다. 이 경 로 는 xpath 로 볼 수 있 고 OU 노드 를 xml 의 정확 한 위치 에 추가 할 수 있 습 니 다. private static string GetPath(DirectoryEntry entry)
{
string xPath = string.Format("/{0}", FormatDNToRelativePath(entry.Properties["distinguishedName"].Value.ToString()));
return xPath;
}
private static string GetParentPath(DirectoryEntry entry, string name)
{
string path = FormatDNToRelativePath(entry.Properties["distinguishedName"].Value.ToString());
if (path.LastIndexOf(name) != -1)
{
path = path.Remove(path.LastIndexOf(name));
}
string parentPath = string.Format("/{0}", path);
parentPath = parentPath.Substring(0, parentPath.LastIndexOf('/'));
return parentPath;
}
이런 방법 이 있 으 면 OU 트 리 를 구성 할 수 있 습 니 다. 다음은 코드 입 니 다. 구체 적 인 절 차 는 설명 을 참조 하 십시오. public static OuTreeNode GetOuTree()
{
XmlDocument xmlDoc = new XmlDocument(); // XmlDocument
XmlElement rootElement = null;
string domainName = string.Empty;
using (Domain domain = Domain.GetCurrentDomain())
{
rootElement = xmlDoc.CreateElement(domain.Name);
xmlDoc.AppendChild(rootElement); // domain
using (DirectorySearcher ds = new DirectorySearcher(domain.GetDirectoryEntry(), "(objectClass=organizationalUnit)", null,
SearchScope.Subtree))
{
SearchResultCollection src = ds.FindAll(); // , OU
foreach (SearchResult result in src) // OU
{
using (DirectoryEntry ouEntry = result.GetDirectoryEntry())
{
try
{
string nodeName = GetName(ouEntry); // OU name
string nodeId = GetId(ouEntry); // OU guid
string xPathParent = GetParentPath(ouEntry, nodeName); // OU
string xPath = GetPath(ouEntry); // OU
if (xmlDoc.SelectSingleNode(xPath) == null) // OU, xml ,
{
XmlElement newElement = xmlDoc.CreateElement(nodeName); // OU
newElement.SetAttribute("name", nodeName); // name
newElement.SetAttribute("guid", nodeId); // gud
XmlNode parent = xmlDoc.SelectSingleNode(xPathParent); // , OU append
if (parent != null)
parent.AppendChild(newElement);
}
}
catch
{
}
}
}
}
}
OuTreeNode tree = BuildOuTree(xmlDoc); // xml OU
return tree;
}
이전 구조의 xml 문서 에 따라 나 무 를 재 귀적 으로 구성 합 니 다. private static OuTreeNode BuildOuTree(XmlDocument tempXml)
{
OuTreeNode root = new OuTreeNode();
using (Domain domain = Domain.GetCurrentDomain())
{
root.Name = domain.Name;
}
GetOUTreeNode(root, tempXml.FirstChild);
return root;
}
private static void GetOUTreeNode(OuTreeNode root, XmlNode tempXml)
{
foreach (XmlNode xmlNode in tempXml.ChildNodes)
{
OuTreeNode childNode = new OuTreeNode() { Name = XmlConvert.DecodeName(xmlNode.Attributes["name"].Value), Id = xmlNode.Attributes["guid"].Value }; // name 。
root.Children.Add(childNode);
GetOUTreeNode(childNode, xmlNode);
}
}
이런 방법 을 사용 하 는 장점 은 한 번 에 모든 OU 를 얻 고 AD 를 방문 하 는 횟수 를 줄 이 며 AD 를 방문 하 는 것 이 느 린 상황 에 적용 하 는 것 이다. 그러나 이 방법 은 문제 가 있다. 바로 OU 를 잃 어 버 리 는 것 이다. xml 을 구축 할 때 부모 노드 가 만 들 지 않 고 하위 노드 를 처리 할 수 있 기 때문이다. 이 문 제 를 해결 하기 위해 조회 한 OU 목록 을 조회 할 수 있다.먼저 정렬 을 하고 'canonicalName' 속성 에 따라 정렬 하면 부모 노드 가 반드시 하위 노드 가 추가 되 기 전에 존재 하 는 지 확인 할 수 있 습 니 다.또한 이 방법 을 조금 만 고치 면 OU 구조의 xml 파일 을 내 보 낼 수 있 고 AD 와 다른 시스템 의 데이터 교환 에 사용 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
XML이란 무엇입니까?이것은 저장, 검색 및 공유할 수 있는 형식으로 데이터를 저장하는 강력한 방법입니다. 가장 중요한 것은 XML의 기본 형식이 표준화되어 있기 때문에 시스템이나 플랫폼 간에 로컬 또는 인터넷을 통해 XML을 공유하거나...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.