使用目录服务以编程方式删除用户

时间:2016-04-14 18:44:13

标签: c# asp.net directoryservices

我编写了一个控制台应用程序,用于生成应删除的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或电子目录中删除。

非常感谢所有的帮助!

1 个答案:

答案 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;
}