- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
需求:将大量数据(OU 内的所有用户)从事件目录中提取到数据库表中。
方法:我的任务是使用 SSIS 来执行此操作,因为作为同一通宵任务的一部分,还有其他项目需要完成,这些都是标准的 ETL 任务,因此这只是流程中的另一个步骤。
代码:
/*
Microsoft SQL Server Integration Services Script Task
Write scripts using Microsoft Visual C# 2008.
The ScriptMain is the entry point class of the script.
*/
using System;
using System.Data;
using System.Data.SqlClient;
using System.DirectoryServices;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
namespace ST_dc256a9b209442c7bc089d333507abeb.csproj
{
[System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
#region VSTA generated code
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
#endregion
/*
The execution engine calls this method when the task executes.
To access the object model, use the Dts property. Connections, variables, events,
and logging features are available as members of the Dts property as shown in the following examples.
To reference a variable, call Dts.Variables["MyCaseSensitiveVariableName"].Value;
To post a log entry, call Dts.Log("This is my log text", 999, null);
To fire an event, call Dts.Events.FireInformation(99, "test", "hit the help message", "", 0, true);
To use the connections collection use something like the following:
ConnectionManager cm = Dts.Connections.Add("OLEDB");
cm.ConnectionString = "Data Source=localhost;Initial Catalog=AdventureWorks;Provider=SQLNCLI10;Integrated Security=SSPI;Auto Translate=False;";
Before returning from this method, set the value of Dts.TaskResult to indicate success or failure.
To open Help, press F1.
*/
public void Main()
{
//Set up the AD connection;
using (DirectorySearcher ds = new DirectorySearcher())
{
//Edit the filter for your purposes;
ds.Filter = "(&(objectClass=user)(|(sAMAccountName=A*)(sAMAccountName=D0*)))";
ds.SearchScope = SearchScope.Subtree;
ds.PageSize = 1000;
//This will page through the records 1000 at a time;
//Set up SQL Connection
string sSqlConn = Dts.Variables["SqlConn"].Value.ToString();
SqlConnection sqlConnection1 = new SqlConnection(sSqlConn);
SqlCommand cmd = new SqlCommand();
SqlDataReader reader;
cmd.CommandType = CommandType.Text;
cmd.Connection = sqlConnection1;
//Read all records in AD that meet the search criteria into a Collection
using (SearchResultCollection src = ds.FindAll())
{
//For each record object in the Collection, insert a record into the SQL table
foreach (SearchResult results in src)
{
string sAMAccountName = results.Properties["sAMAccountName"][0].ToString();
//string objectCategory = results.Properties["objectCategory"][0].ToString();
string objectSid = results.Properties["objectSid"][0].ToString();
string givenName = results.Properties["givenName"][0].ToString();
string lastName = results.Properties["sn"][0].ToString();
string employeeID = results.Properties["employeeID"][0].ToString();
string email = results.Properties["mail"][0].ToString();
//Replace any single quotes in the string with two single quotes for sql INSERT statement
objectSid = objectSid.Replace("'", "''");
givenName = givenName.Replace("'", "''");
lastName = lastName.Replace("'", "''");
employeeID = employeeID.Replace("'", "''");
email = email.Replace("'", "''");
sqlConnection1.Open();
cmd.CommandText = "INSERT INTO ADImport (userName, objectSid, firstName, lastName, employeeNo, email) VALUES ('" + sAMAccountName + "','" + objectSid + "','" + givenName + "','" + lastName + "','" + employeeID + "','" + email + "')";
reader = cmd.ExecuteReader();
string propertyName = "Description"; //or whichever multi-value field you are importing
ResultPropertyValueCollection valueCollection = results.Properties[propertyName];
//Iterate thru the collection for the user and insert each value from the multi-value field into a table
foreach (String sMultiValueField in valueCollection)
{
string sValue = sMultiValueField.Replace("'","''"); //Replace any single quotes with double quotes
//sqlConnection1.Open();
cmd.CommandText = "INSERT INTO ADImport_Description (userName, objectSid, objectDescription) VALUES ('" + sAMAccountName + "','" + objectSid + "','" + sValue + "')";
reader = cmd.ExecuteReader();
//sqlConnection1.Close();
}
sqlConnection1.Close();
}
}
}
Dts.TaskResult = (int)ScriptResults.Success;
}
}
}
我希望你们中的很多人会认出这与数据女王这篇帖子中的代码基本相同:http://dataqueen.unlimitedviz.com/2012/09/get-around-active-directory-paging-on-ssis-import/当我自己编写的代码遇到很多问题时,我已根据自己的目的对其进行了调整。
目前,这一切都在一个脚本任务中。是的,我已经添加了相关引用资料,所以它们就在那里。
问题:当我在 SSIS 中运行脚本任务时(单独运行以避免包的其他部分干扰的任何机会)我得到:
Error: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
at System.Collections.ArrayList.get_Item(Int32 index)
at System.DirectoryServices.ResultPropertyValueCollection.get_Item(Int32 index)
at ST_dc256a9b209442c7bc089d333507abeb.csproj.ScriptMain.Main()
拜托,任何人,任何想法????????
最佳答案
所有归功于@billinkc(billinkc - 如果你添加一个答案我会接受它而不是这个但我不喜欢留下未回答的问题所以现在添加你的答案因为你没有在最后添加答案周)
"My guess is the failing line is string employeeID = results.Properties["employeeID"][0].ToString(); as you are probably getting things like Service accounts which won't have an employeeID defined. Copy your code into a proper .NET project (I like console) and step through with the deubgger to find the line number. – billinkc"
关于c# - 将数据从 AD 拉入数据库的 SSIS 脚本任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13977273/
我正在尝试从 json 数据中获取事件日历。我只想突出显示日期,并在用户单击日期时在日历下方更新一个包含事件详细信息的 div。我的应用以以下形式提供 JSON: [ {"Date":"02/06
今天是我玩 GCR 和 GKE 的第一天。如果我的问题听起来很幼稚,请道歉。 所以我在 GCR 中创建了一个新的注册表。它是私有(private)的。使用 this文档,我使用命令获取了我的访问 to
我一直在尝试从 Meteor 内部的 Mongo 中提取一个数组,但我似乎无法让它工作。我能够很好地插入它。任何帮助将不胜感激。这是我的 html: {{#each employee.sch
我有一个 (datetime.timedelta(0, 7200) 的对象对于 2:00:00我正在尝试将其转换为 2.0两个小时。分别如果我有datetime.timedelta(0, 9000)
我刚刚开始学习 Hadoop,我想知道以下问题:假设我有一堆我想要分析的大型 MySQL 生产表。 似乎我必须将所有表转储到文本文件中,以便将它们带入 Hadoop 文件系统——这是否正确,或者是否有
我不想提交一些已更改的文件(例如 web.config)。在拉取并更新到新的变更集之前,我必须将它们搁置起来。拉取和更新后,我必须将它们取消搁置。 我目前正在使用 TortoiseHG。有没有任何扩展
这个项目的背景。一开始是一项简单的家庭作业,要求我存储 5 个邮政编码及其对应的城市。当用户在文本框中输入邮政编码时,会返回对应的城市,反之亦然。我编写了返回这些值的代码,但后来我决定将所有邮政编码及
最新的 Google Newsstand 应用程序具有 ActionBar 和 ViewPager 选项卡栏,当向下滚动下方的列表时,它们会缓慢地显示屏幕顶部。 重要的是,它以与滚动列表相同的速度缓和
此脚本可以出色地将电子邮件提取到我的工作表中。我的问题是该函数只提取列出的前两个字段。例如,getPlainBody、getSubject - 尽管需要更多字段。因此,我没有使用一个函数来提取我需要的
我正在提取一些会有所不同的 JSON 数据...例如: 返回的数据可能是: [{"userID":"2779","UserFullName":" Absolute Pro-Formance"},{"u
我正试图从 Firebase 获取报价,但我很挣扎。当然,我也不知道我在做什么。我需要一些帮助! 在 Firebase 中,我的报价设置如下: root --> quotes --> quoteID
我将 UIRefreshControl 与 UICollectionView 一起使用。刷新有效,但 View 在拉动后不会停留在顶部(与 uitableview 一样)。有没有办法让这个坚持下去,还
我用来提取提要标题的脚本是: "; foreach($x->channel->item as $entry) { echo "link' title='$entry->title'>" .
我一直无法从 excel 中获取单元格值并在 word 宏中使用它们(我正在尝试在 word doc 中的各种书签处插入来自工作表单元格的字符串值)。现在我只是想能够访问单元格值,但我想出了一个错误
我正在尝试为 PhoneGap 设置一个 JSON 查询,该查询会提取通过 Expression Engine template 创建的 JSONP .如果我直接导航到我的 JSON 页面,htt
所以我有一个 Xcode 项目,我从注册页面获取字段,然后推送它们进行解析。我有另一个 View ,其中我有标签,我想将这些自定义字段从 Parse 拉入其中。 这是我存储数据的方式: 让我的用户:P
在 Matlab 中,我使用类似于以下的语句从 mySQL 数据库中提取数据: SELECT PrimaryKeyVar, Var1, MyDate, Var2, Var3 FROM MyDataba
在系统限制下工作,我需要一种方法将本地 .php 或 .html 中的工作代码放入目标 div 中,而无需额外的库、jfiddle、iframe 等(jquery 就可以) 这是我失败的尝试。 文件的
设置场景: 我已经设置了一个多节点Kubernetes cluster并部署了Jenkins Helm Chart与 Jenkins Kubernetes plugin .我们在(公司)内部运行企业
Controller : def get_nodes ... render :text => nodes.to_json.to_s end 它呈现有效的 JSON(它由我的 chrome 插件
我是一名优秀的程序员,十分优秀!