So I’m working on a small interface that needs to check certain computers in our enterprise for file changes, and fortunately these specific computers are kept in a group nested inside our AD structure. My thought was, if I can use a SQL query to go get that list of machines, put the results in a table, then have the interface read from that table it would always have a current list of these machines, with no maintenance required for adding and removing these PCs. Here’s what I came up with:
First, the database needs to have ad hoc queries enabled. This is done in the Surface Area Configuration for Features section of Surface Area Configuration on the affected DB server. You’ll need this in order to use commands such as OPENROWSET and OPENDATASOURCE. In this case, we’re going to use OPENROWSET. Set this first, then use the following query:
Obviously you’ll want to substitute the DOMAINusername and password, as well as the LDAP://server and the memberOf sections for your network’s info, but this structure will work. Feel free to substitute distinguishedName for another property if you want different results.
I’m always getting, updating, and validating against AD info at my company, and today I needed to pull several different schema attributes in one method, and kept running into more and more trouble. Code got bigger and bigger, and I thought there had to be a way to simplify this. I then ran across a CodeProject article definitely worth mentioning. The author, Rajasekhara Sambangi does an excellent job of demonstrating a simplified way of pulling just about anything from AD by passing in the SearchResult object and the property name you’re searching for into a basic method, and the result is the value of the key! The link to the article is here.
Ok, after much research I found a forum that had a posting that demonstrated how to get the Nth chosen weekday of a month using T-SQL. Here’s the code:
DECLARE @date datetime
DECLARE @weekday int
DECLARE @day datetime
DECLARE @number int
DECLARE @WhichOne int
SELECT @WhichOne = 2 — Set this to the week you want to grab
SELECT @number = 1
SELECT @weekday = 0
SELECT @date = getDate() — Change to dateadd(month, 1, getDate()) for next month, etc.
WHILE @weekday 4 — Change this value to be the day of the week you’re looking for
SELECT @day = (CAST(STR(MONTH(@date)) + ‘/’ + STR(@number) + ‘/’+ STR(YEAR(@date)) AS DATETIME))
SELECT @weekday = DATEPART(weekday, @day)
SELECT @number = @number + 1
SELECT DATEADD(d, (@WhichOne – 1) * 7, @day)
Many MANY thanks to Tara for this posting! The link to the forum post is here.
Now, how did I get InfoPath to see this? In the InfoPath form, I added a DatePicker control. Next I had to create a Data Source, point to a server and database on our network somewhere (doesn’t matter where). Click “Edit SQL” and add this code to that box. Click through the wizard and right click on the control, choosing Properties. Click the Function design button next to Default Value, Click Insert Field or Group, and under Data Source, choose your newly created data source. Expand out the tree until you see your result set field and choose it. Don’t forget to export your data connection to a Data Connection library on your SharePoint server and site, or the form won’t work.
In this example, I need to know the second Wednesday of next month, because that’s when server maintenance is every month. But what day is it? Here’s the Excel formula:
Notice the DAY argument of the first DATE function in the formula says “1+7*2”. The “2” represents the week of the month, so if you wanted the third week change it to “3”, etc.
Next, notice the DAY argument of the second DATE function in the formula says “8-4”. The “4” represents the day of the week, where 1 is Sunday, 2 is Monday, etc. So if you wanted Fridays only, change it to 6.