通过计划的任务运行C#脚本

时间:2020-01-14 15:10:33

标签: c#

我已经用c#开发了一个小脚本,用于查询SQL Server并根据某些条件将计算机对象添加到某些Active Directory组中。当我使用具有必要权限(从Active Directory组添加/删除对象)的帐户运行脚本时,脚本运行良好。

当我尝试安排作业,因此它使用“ SYSTEM”帐户从服务器自动运行时,它不起作用,我收到“访问被拒绝”的信息,我已更新绑定帐户,以使用有效帐户的凭据但我仍然有同样的问题。

> Error Message:
> *2020-01-13 18:32:30,984 [1] ERROR TestAD.clsActiveDirectory - Error occured when trying to add computerobject abcdefg-a10 to group. Error
> message: Access is denied.*

使其生效的唯一方法是使用实​​际帐户作为运行计划任务的帐户,但是问题是我们的公司政策不允许我们存储密码,因此我需要将该帐户登录到运行此脚本。

代码段

                    de.Username = "testing@test.com";
                    de.Password = "xxxxxxxxx";
                    de.AuthenticationType = AuthenticationTypes.Secure;
                    de.AuthenticationType = AuthenticationTypes.Sealing;
                    de.AuthenticationType = AuthenticationTypes.Delegation;
                    de.Properties.Count.ToString();
                    ds.SearchRoot = de;
                    ds.Filter = "(&(objectClass=computer)(name=" + _myComputerName.ToString() + `"))";`
                    ds.PropertiesToLoad.Add("memberof");
                    ds.PropertiesToLoad.Add("distinguishedname");
                    ds.SizeLimit = 10;
                    ds.PageSize = 0;
                    ds.SearchScope = System.DirectoryServices.SearchScope.Subtree;

我尝试添加一些“ AuthenticationTypes”以查看是否有所不同,但仍然相同

任何帮助将不胜感激

谢谢。

2 个答案:

答案 0 :(得分:0)

您是否尝试过使用SQL Server代理?我的公司使用它们而不是预定任务。它们可能不太优雅,但可能是您情况的一个很好的选择。

  • 创建一个SQL Server代理,以调用带有或不带有参数的可执行文件。
    • 如果无法从托管操作系统调用可执行文件,则可以在网络上调用SSIS程序包来为您调用可执行文件。

如果您需要更多详细信息,请告诉我。

答案 1 :(得分:0)

我发现了问题,最后很简单。 Active Directory流程如下 -使用我的特殊帐户绑定到活动目录,并搜索计算机对象和 验证是否需要将其添加到Active Directory组中 -如果需要添加,请第二次绑定到Active Directory组并添加计算机 目的。 ==>使用计划任务或在“ SYSTEM”上下文中运行时,此片段失败

失败原因:第二次绑定时,我没有指定任何凭据,因此 如果我运行具有足够权限的帐户的脚本,则使用默认凭据(SYSTEM) 将计算机对象添加到组的权限。

我更新了第二个绑定的代码以包含绑定凭证,现在它可以作为 预期的。

我希望这对必须解决类似问题的其他人会有所帮助。

旧代码

    try
    {
        DirectoryEntry ent = new DirectoryEntry(bindString);
        ent.Properties["member"].Add(newMember);
        ent.CommitChanges();
    }

新代码

    try
    {
        DirectoryEntry ent = new DirectoryEntry(bindString);
        ent.AuthenticationType = AuthenticationTypes.Secure;
        ent.AuthenticationType = AuthenticationTypes.Sealing;
        ent.AuthenticationType = AuthenticationTypes.Delegation;
        ent.Username = "test123@test.com";
        ent.Password = "test123";
        ent.Properties["member"].Add(newMember);
        ent.CommitChanges();
    }