我编写了一个控制台应用程序,用于生成应删除的Active Directory和Novell电子目录树中的帐户报告。该程序非常适合生成一个信息丰富的列表,因为它符合我公司的要求。
我现在被要求查看如果我可以增强此程序以额外删除某些帐户。
我只使用Directory.Services连接到不同的树,并且不想更改此连接类型。现在我可以成功删除位于搜索根目录的对象。我现在的问题是我似乎无法删除在subOU中找到的任何userobjects。
以下是我的函数删除用户对象的代码...
static void Perform_Deletions(List<UserAccountObject> User_List, DirectoryEntry myLdapConnection)
{
DirectoryEntry userToDelete;
myLdapConnection.RefreshCache();
string cnRegex = @"^([^,]+)";
Regex myCNRegex = new Regex(cnRegex, RegexOptions.IgnoreCase);
foreach(UserAccountObject user in User_List)
{
foreach(Match myMatch in myCNRegex.Matches(user.Distinguished_Name))
{
string cn = myMatch.ToString();
userToDelete = myLdapConnection.Children.Find(cn);
myLdapConnection.Children.Remove(userToDelete);
myLdapConnection.CommitChanges();
}
}
}
我确实删除了错误检查并重命名了一些区域,以便不提供内部信息。但无论如何。我确信我的问题可能在于此代码的第10行。如何修改此行或更改此函数,以便在初始DirectoryEntry指向“LDAP://server1.contoso.com/OU=users,DC=contoso,DC=com”时;并且用户对象位于“OU = Team1,OU = users,DC = contoso,DC = com”,它也将被删除?
目前,使用此代码,原始条目中的所有用户都将在AD或电子目录中删除。
非常感谢所有的帮助!
答案 0 :(得分:0)
所以我能够编写一个适合我的要求的解决方案,但我觉得这可能不是最好的解决方案,因为我必须为我需要删除的每个DN创建和销毁目录服务器的连接。必须有一种方法可以通过单个连接发送要删除的DN列表。
#define UNICODE
#include <Windows.h>
HINSTANCE g_hinstance = 0;
LRESULT CALLBACK ChildProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, msg, wp, lp);
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg)
{
case WM_KEYDOWN:
{
if (wp == VK_F5)
{
MessageBox(0, L"VK_F5 detected", 0, 0);
if (!CreateWindow(L"ChildClass", L"ChildTitle",
WS_VISIBLE | WS_POPUPWINDOW | WS_CAPTION, 100, 100, 300, 200,
hwnd, 0, g_hinstance, 0))
{
DWORD err = GetLastError();
wchar_t buf[100];
wsprintf(buf, L"%d\n", err);
MessageBox(0, buf, 0, 0);
}
}
break;
}
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, msg, wp, lp);
}
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, int)
{
WNDCLASSEX wcex = { sizeof(WNDCLASSEX) };
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.hInstance = hInstance;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
wcex.lpszClassName = L"MainClass";
RegisterClassEx(&wcex);
wcex.lpszClassName = L"ChildClass";
wcex.lpfnWndProc = ChildProc;
RegisterClassEx(&wcex);
CreateWindow(L"MainClass", L"MainTitle", WS_VISIBLE | WS_OVERLAPPEDWINDOW,
0, 0, 600, 400, 0, 0, hInstance, 0);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}