Webcast: How to schedule tasks using PowerShell

company JJB
JJ Bateman|Updated May 17, 2021
image (76)
image (76)
    No Data


    Thu, 2/4 2:56PM • 35:13


    Lex, JJ, Jordan, Kelly

    Jordan  00:00 --- Everybody, I'm Jordan with PDQ.com. Today, we're gonna be talking about using PowerShell to create scheduled tasks or using group policy for the same thing. It's basically a way to be able to run stuff against machines where the users where it requires the user profile where it's not always so simple with a regular deploy. I guess, for the first part, if you can use Group Policy do. Group policy is it's fantastic at what it does, there's no reason to try to reinvent the wheel. Understand ...

    Lex  00:31 --- the right tool for the right. Yeah, right tool for the right job, right?

    Jordan  00:34 ---  Yeah, it's, I understand not everyone has access to a database on their environment. But if you can use Group Policy, you can just do these logon or logoff scripts where you can put in a PowerShell script or there's others, but PowerShell scripts, mostly, why use anything else, that you can kind of run on log in or log off where you can hit the user profile, and you don't have to, and then it's stored centrally. So you don't have to track it, it's if you are looking to do this, where you're looking to control the user's environment at all, that would be my recommendation. But we get reports of people that can't, so we're just going to kind of work on building out a way that they can perform something similar without the central repository, as awesome as that is. so 

    Lex  01:15 --- Often that you get that. Sorry, man, it's often you get that question where it's like, you know, it's like, I don't have access to that. So how do I do it, And this is how.. is going to show you how to get access to GPS and stuff. 

    Jordan  01:29 --- So with all things in PowerShell, the names of their commands are usually right on the nose, it's verb dash (-), and then exactly what you're looking for. So we're looking for just I'm doing get-command to pull all from here. Scheduled tasks. I don't know if there's an S at the end. So I'm gonna leave that off just in case, that's not good did I spell schedule, or do I left off scheduled

    JJ  01:52 --- Off to a great start. 

    Jordan  01:52 --- There we are, there's a D in there, I 

    Lex  01:55 --- use my keyboard again?

    Jordan  01:56 ---  Although this, I don't, I don't need your equipment to fail on my own. I do it, I do it. Alright, so the important thing with this one is it's not just so much as just a new dash scheduled tasks, you have to define a couple of parameters, and there's a commands commands for each one. So if we do, we'll start off with just get scheduled task, or I guess we'll do new scheduled task. And then as you saw that there's action, this is what the scheduled tasks will actually be doing. The principle which I'll dive in this one a little bit, there's a little bit more to that one, the setting set, which actually just run that one. Now, these are just the default settings that is going to come. So if you don't want to allow something like the on demand start or you don't want to enabled initially, you can change that scheduled set there and assign it to a variable and push that when you're actually creating it. And then the last one would be a trigger. This is how often it runs. The one we're mostly focused on is at logon, there's all kinds of settings you can do. But we're figuring in this case, if it's machine level, you can use either PDQ Deploy, that's my recommendation, I like the product a lot, or any other anything else where you can impact the machine directly. But we're looking for Q scheduled tasks to impact user specific things. Something like local policy, if you don't have the Group Policy, you can change something or uninstalling software, you don't want, installing printers, stuff like that, where when a user logs on, you want this to run for them. But outside that you can get pretty, pretty complex with it, you can set you know, at once at 7am. And then you can put in things like a repetition interval. So this is it's gonna repeat every 30 minutes. But it has to be a timespan for this one. So it's gonna be just in parentheses here new-timespan. That's not how you spell time at all. New-timespan and then you could just do minutes for 30. 

    Lex  04:00 --- I just want to know Jordan, what what makes you think I'm going to log on at 7am? Dude, I never get up that early. 

    Jordan  04:05 --- Well, that's why you can set multiple triggers. So you have set one for log on and one that arrives at 7am. And it's going to kick off either way at that point. And then if you want to get on Yeah, if you want to get malicious, you can put like a random delay in there of 10 minutes. So let's say I was putting in some sort of video, YouTube video. He-man singing maybe. And I wanted this to run off often, I could set in here with the delay of 30 minutes. So this is getting or not 30. We'll do 10 minutes. So this is going to run starting at 7am every 30 minutes, but it's not exactly 30 minutes at this point, it's going to take a random interval of 10 minutes, 10 minutes less or longer and run at that point. And then if we wanted to run this as the NT authority system with a pass through, it's going to send the volume through without the video. I'm not saying you should do that. I'm just saying that'd be kind of funny.

    Lex  05:01 --- I had a question for you. Okay, why would you use a random delay? I mean, I understand why you're doing it. But I'm trying to think of a case where you would use a random delay?

    Jordan  05:11 --- Well something where if it's like you don't want it to run, as soon as they log on, you could put in a delay like that where it delays, you know, up to 30 minutes at that point, it's just so it's not runs right away. I can't think of a perfect example. But hey, if anyone has it, I'd love to know.... load balancing. Thank you, Marcel. I mean, that's the idea I just had, without reading the chat was load balancing. Alright, and the last thing that we went over, that I kind of skipped over was the principal. And what this is for, so if you build something, just if you build the task schedule, and I send it out to a machine to build that, it's going to use the credentials as the user that runs it, when it builds it, so it could be  I use my own credentials, it's going to run as me. So if you're looking for logon, especially where it's something where it's running Chrome, or something along those lines, it's not going to pop up in that window, because it's only going to run for the my credentials instance. So with, with the principle, you can specify a group ID and this is where you do like the built in users this would run for all users or admin. Is it user, users? And then just for that, one

    Lex  06:26 --- do with S, do it with S

    Jordan  06:28 --- just Well, I have an example actually have it in there, and I'm not running this one. So I'm sure I'll be will correct that when we get to it, and then just I set the run level highest. So if it needs elevated permissions that will have it. For this one, if they are a part of the users group on that machine, then it's going to run in their instance, it's just a way to kind of a workaround to run as them just to kind of make it easier. It's, it's basically mimicking what's gonna happen if you do a logon script for the Group Policy. Alright, so I suppose real world examples, we have a couple things, the two most common things where we need a specific user profile on this one is as removing software that's installed per user profile, we're going to be doing the Appx one, which shows up there with the newer versions of Windows, the all users does work. So this is kind of less value. Another example is Firefox, which if they don't have permission to install while still install  on your user profile, you could go and have this run on log on where it's going to take Firefox out there if you didn't want it. So basically, this is from I did an Appx removal long, long ago, and I reuse this because I don't want to create new things, that sounds like a lot of work. We're basically we're just defining a whitelist of things, we don't want to remove MS Paint calculator, Windows Store, like Windows Store is not going to be there in the enterprise. And it's not so much I want to keep it but it's not going to let you uninstall it anyway. So it's just to avoid errors. And then we're going to go through and for each one in our whitelist, we're going to find dependencies and add that to the whitelist, we don't try to remove the dependencies, because once again, it's not going to let you just throw up an error on that one. So we're just kind of avoiding things that are going to throw up an error. And that at the end of thing we're going to come in list, we're going to grab it if it is in our match list of things to remove and is going to remove the Appx package. And just real quick for if you did want to just run this against all users, it's not just a direct all users all users, you have to do a package filter type as bundle and pipe that into all users. That's not super relevant. But I noticed with the all users people are running into errors, and online forums and specifying that as bundle is what's gonna make it work when you pipe it into the all users over here. Like that, but we don't want that one. That's that that's for the different methods. We're just running this on a single user. Alright, so we're running this script and the build the ... the actual task, we're coming in here. As you can see, we're defining the action and we're running PowerShell with the PowerShell script that we made. Appx ps1 is different than what I named this one. So why don't we make that match, so it doesn't fail. Testing's fun. All right. All right. And then next thing we're setting the time we're just going to run this one on log on, because this one when they log in, is when we want to move and we're going to run it against them. I'm not setting anything specific on the settings sets. But this is where you come in here and like disabled demand start or have it disabled to start where you can change those kind of settings. where we're adding all the variables we just put in there the time to do stuff and print them out names are really on the nose and unnecessarily long. All right, and then the last step is the register scheduled task and that's where we're taking in the new task we built, and we're putting in as an input object. So I guess we'll do that as a new package. Since I don't have that script out on a file share, we're gonna run the first step to kind of copy that over to their machine. Appx removal, and we're just going to put it in the C drive/temp, because I'm not real clever with coming up with a good place. But in real world case, you're going to want to put that somewhere where the user is not likely to find it, delete it, if you are planning to run against it often. Say that this file copy and then the next step is a PowerShell step, where we're going to use the PowerShell we just went over here. And I could just point it to the actual script that I have saved there. But apparently, I like doing the copy and paste a lot. All right, and we have that just, I guess I should verify. We're gonna run that against wily Coyote. That guy's high jinks make them a perfect example case.

    Lex  11:16 --- Yeah, I just want them to catch the bird. I do. 

    Jordan  11:19 --- Is there 2 E's in Wiley? No, there's not. Okay. So in the future, I'll use an example that I can spell. Just going to run that one what guess? Well, that's connecting. Do we have any questions?

    Kelly  11:36 --- Hey, Jordan, I would like to schedule a task to launch a wrench to modify a read edits key. And my second purpose is to know how to do a scheduled task to launch a script. Sincerely, Champlain I.

    Jordan  11:51 --- champlain on that one, actually, my next example is one where I'm doing exactly that. But looks like I was still running. A quick rundown, basically, for the action, you said to execute PowerShell. And then I'm doing I don't think I need to start process that seems unnecessary. As he changed it before it goes live, what could go wrong? And there's just a set item property where you're specifying the registry key you want to change and you can run that one. And then every time that that scheduled test run, it's going to run PowerShell with that command, when I'm probably going to regret modifying that live, but I guess we'll see. Alright, so I got an error. Couldn't validate settings. Let's go and take a look at that one. And Isn't it fun? The one I didn't change is the one that broke. See settings for stuff, 

    JJ  12:54 --- The magic of live.

    Jordan  12:59 --- Appx

    JJ  13:02 --- Here you get to watch Jordan's thought process. I'm going to David Attenborough this narrate it for him. Jordan In his natural habitat. Yeah.

    Jordan  13:12 ---  So look in there. I don't see. Let's see you have the in the first one. Thank you, sir.

    Jordan  13:22 --- ...Settings for stuff. I'm not sure exactly what that is. Oh, settings for THE stuff. Okay. My variable names were different. Thank you. Thank you. I would not have found that one. All right, we're gonna we're gonna copy that one over. Team support. What's uh, 

    Lex  13:42 --- It's so hard to do this live guys.

    Jordan  13:46 --- I ran this. So somewhere between me testing this this morning. And now I changed that without remind without recognizing that I was changing my own stuff. All right. Now we're back in, we're gonna redeploy that one.

    JJ  14:03 --- Are definite articles common in variables? 

    Jordan  14:06 --- No, no, I got two funny quotes. With my variable names. Now look what happened. The pointer variable should be it should be describing you know what it is without being too complex. And I failed again,

    Kelly  14:19 ---  I think it's just because you sabotage yourself. Otherwise, we couldn't bear the awesomeness of you. 

    Jordan  14:26 --- And look at that. It comes down to the again.

    JJ  14:31 --- Check line four, line four. Yeah.

    Jordan  14:35 --- Okay, yep. There you go. All right. Now, this time, for real this time. Sure. You go in there. The takeaways to this one is make sure your variable names are same across the board. Otherwise it's going to have a null variable. And you're going to look really dumb on a webcast in front of people. I would take away yours, but I think I have toelevate my game before I become your guys's peer

    JJ  15:02 ---  takeaway two is use VS code.

    Jordan  15:08 --- All right, this time is gonna work, I feel it. He said with without a lot of hope. it hasn't failed yet. So I'm gonna assume it's working. Alright successful. So now we're gonna come over this is wily coyote here and we're going to look at the scheduled tasks or task schedule. And I don't remember what I named it, remove Appx, look at that help there. So it did build that one. And it has all the settings that we put in there. As you can see, I didn't set a specific user. So with the credentials that I had when I deployed that one, if you did want to not specify a group, but just a user, you can specify any user you want. If you use something like the NT authority system, or any of the common accounts like that, you don't need to provide credentials, but if you're using a non standard account, you would need to provide the password as well as the username. And that would be it because we're just doing here, it'd be up here. So if this is the NT authority, and I'm going to try to spell that live, NT space authority, you wouldn't need to put any sort of credentials, and then it will run as the system on that one. For the next one, which, before I run this one, I'm going to check my variables. And  look at that one, put in the chat for me, that is how you spell it. And VS code would have pointed that out? Yes, yes, thank you about VS code. I'm told I need to start using that all the time. But I'm resistant to change. It scares me. All right, and so and as for the question, we talked earlier, about how do you change registry has to exist, you're setting item property, you have to know where it is. And we're setting in this case, the PowerShell execution policy to 'Joseph Ignace', which, that's funny to me. But we're actually what will change that one, 

    JJ  17:12 --- a little inside joke to yourself?

    Jordan  17:13 --- but that that is the guy that  invented the guillotine.

    Lex  17:20 --- I thought that was Inigo Montoya.

    Jordan  17:23 --- So we sent this remote signed. And it's important, especially this one for changing it, if I had my typo in there, where it remore signed, then it is going to set the execution policy for that user instance, as remore signed, which isn't real, I don't know exactly what kind of issues that's going to cause but I assume it's going to cause some not fun issues. So in this one, we're just going to go and we're going to change the execution policy to remote signed. But it's the same thing, we're building the action trigger the settings, we're not going to put the disabled run on default. And the only difference is we're changing it to the principle of the built in users. So every person that logs into that machine will have this run. This is like I said, the execution policy, computer is going to trump user. And if you set it with Group Policy, it's going to trump all of those, there's no way you can override that. So this is kind of the lowest level setting is just for that user instance, if someone came aboard and set all unsigned or, is it all unsigned? I guess I'll find out real quick. Well, I can't run that one. Oh, I have to specify scope. current user, and we'll do List them. My goodness, I've been trying to get fancy with this with current user. So this undefined means it's gonna go whatever the default is, I believe all signed means has to be signed. But whatever you set it to, it's gonna be set for that user. If someone sets it on the computer level, it's going to take that function over the user setting it kind of works this way up, user, computer, Group Policy. Alright, now we're gonna check our variable names because I'm a slow learner, but I do learn. More stuff who run in it? Okay.

    JJ  19:09 --- I'm having a hard time reading the variable online for without criticizing your it, you don't like that? It's not I'm pronouncing it in something you probably can't say on YouTube or maybe even in the chat. It's a testament to maybe using camel case.

    Jordan  19:32 --- All right, well, I apologize for for making you think those thoughts

    JJ  19:37 ---  making me giggle?

    Jordan  19:40 --- Alright, so this one says we're not copying over any file this time. If you did have it, it'd be the same thing. You make the ps1 you copy that over where you have it in a file share that's accessible. And you just point it to run PowerShell from there. But in this case, we're just going to have this one. We're going to say run, maybe I should name it. Execution policy. Save that one, and I guess while we're running this one, since I'm now somewhat confident this one will run. Do we have any other questions?

    Kelly  20:17 --- Hey, Jordan, how would you use a PowerShell script to run at machine boot before a user logs in sincerely, Tony underscore block,

    Jordan  20:29 --- We're deploying that one. For that one, we're gonna go over to our, the time to do we have at log on. And there's, there's quite a few settings, you can do that when you can have daily at log on, I don't know if there's one on startup right there. There is if you are building these manually, a way to do it on log on or log off. But I haven't seen a way in PowerShell to add that. So if someone has it, that would be interesting to see. But just instead of on log on, you just want to set this to at startup and when the machine starts up is when it will run that one. Hey successful

    Kelly  21:28 --- you sound surprised?

    Jordan  21:29 ---  Well, here's a well, based on things have things have gone so far. Yes, I am. Right, that's the same one, this one is set to the highest privileges that we had set in there it is running as users instead of a specific one, or the trigger is the same at at log on there. If you wanted to do multiple triggers, like we're talking earlier, you just build a second variable for the other trigger. Like we have here, the scheduled task trigger. And then just over here on the trigger settings, you just put a went too far, just a comma. And now the other variable, and it will build both of those triggers. One thing I didn't mention is on a scheduled task, you can have up to 32 actions. But just like with Group Policy, keep it simple. Have the scheduled tasks do what is supposed to do, don't put it all in one thing, it makes it difficult to troubleshoot just what one action one scheduled task, you don't have to like you can have 32 that's just my my personal recommendation. All right, and now that we have all these fancy scheduled tasks I guess we might want to track them. But since we don't have the central repository, where Group Policy you remove, it is going to remove from everyone as it goes this one, something changes you need, you need to be able to check in and make sure it's working right. And that one is just going to be get scheduled task, which is going to give you all the tasks, not necessarily the info, but we'll just run that real quick. So you can see. As you can see, there's a lot of scheduled tasks in there. By default, I'm going to specify the path as just the backslash. So if someone was so clever as to not put it in the default location, this, this wouldn't find it. But since I know I'm the only one that's been on this, I know I'm not clever. So you can see here we have the scheduled tasks of I'm not sure this is real, nothing nefarious, probably a virus, and all looks good to me. So go there, if you're looking for a little bit more information, just want to pipe that into a for each. And then that's just going to be get scheduled task info. But we're just going to tab through it until and make sure I'm right. Info and then you have to specify from what you're typing in there. And I believe it's task name. In there, if we run this one, that's going to give us each of those tests that are found there in the signal that you know, the last runtime, you know, just a little bit more information. So if we put this, we take this, we put it into a PowerShell scanner is a quick way to scan all your machines to see if you have any rogue scheduled tasks. If you want to get really complex, you could go through and find some way to remove the default ones. I'm not sure how to do that. Because I mean, at some point at Microsoft Windows, you can't just exclude the Microsoft Windows. So there's a lot of different names in there. So it's probably one where you can have a lot of data to parse or if you're only looking at the default you'll grab it. But we'll come into inventory now.  Tools, no not tools. What am I looking for? Quick bail me out next... New scanner. 

    Lex  24:40 --- Yes.

    Jordan  24:43 --- We're gonna name this one shed task and then we're going to finish. I'm stopping not because I forgot how to spell schedule, but because I'm saving time.

    Lex  24:55 --- Sure.

    Jordan  24:57 --- All right, and we're just going to put that in there script once again, probably better to use a file that way. Editing is gonna happen in an editor. But you know, I keep on saying to do that, and I never do. For a scanner, and then right run against, I guess we could run against all the machines, it doesn't doesn't really matter on that we're gonna scan the collection with a whole bunch of A's. But while that's running, do we have any other questions?

    Kelly  25:30 --- We sure do. Hey, Jordan, can you have the task delete itself out of Task Scheduler after it is run once? De Martin.

    Jordan  25:40 --- Absolutely, there's a few options for that one, where there's settings that you can go into... Show among this one here, there isn't a setting under I believe, conditions or settings. But basically, if it is not scheduled to run, again, delete after 30 days, you can have that one, or you can set it to just be disabled after the one runs. But there's ways within the task scheduler to set the if it is not scheduled run. I'm not sure where to find off top my head, but let's find find, see if we can find it. I'm going to start with the settings because that seems like the most likely, most likely option. So we're going to do new schedule settings set. Get rid of that. All right, and let's see here we're looking for see delete expired tasks after so there is within the new schedule settings set to delete expired task after without looking at it, I suppose I should do a do a get-member on that one without looking at it, it's probably a timespan where you can set a time without delete. Which if it's one where when it's running a scheduled time, you can be very clear if one that requires a log on, you might want to give yourself a little bit of leeway, but it will still delete after the time that you specify. All right, it looks like no no scanning errors. If we don't scroll down, all those are servers that don't have the task object we're looking for. So those were acceptable failures. I shouldn't have run that against servers. What was it run against Wiley Coyote? Right? And good impact, good feedback.

    Lex  27:19 --- sorted alphabetically man, I thought I was

    Jordan  27:24 --- wiley coyote, there we go. And the PowerShell scanner, and we're looking for not map drives, but the scheduled task. And you can see in there we have all the tasks and the information that was in there. So you can kind of see what time is in there. And it looks like with that none of these have ever run, which is 

    JJ  27:43 --- We're gonna schedule like it's 1999.

    Jordan  27:47 ---  And that's pretty much it. that'll let you build everything you need for running against the user profile, if it's specific to them. It doesn't have to be for logon, as we saw you can do on startup. And then just a way to kind of track what you have in there. So you can go through and do the cleanup after. If you are building these, you might want to build your own path instead of just the backslash. So you can do a scan just for the ones you built, you know about and so you know if there's any that are hanging around that shouldn't be. Do we have any other questions?

    Kelly  28:14 --- We do. As a matter of fact, we have a few. Hey, guys, I was wondering if you have a rule of thumb or best practice for how many scanners to add to a scan profile before it becomes too large? Is it better to have multiple smaller scan profiles versus one larger one? Thanks, guys. Appreciate the webcast sincerely, Chris SSSSSS

    Jordan  28:34 --- Well, my personal opinion on that one is it depends on how often that scan is running. If it's something that you're running constantly robot, you want to keep it as small as possible. But if it's something that you run once a month looking for something in particular, I don't think it matters how many you put in there. So it just depends on how fast your network is and how often it runs. just build whatever feels right. Unless Lex disagrees with that one.

    Lex  28:59 --- I agree with you, again, certain things aren't going to change a lot like hardware. So, you know, you can put those in a less, you know, less aggressive scan. But yeah, I'm with you, Jordan. 

    Jordan  29:10 --- Okay. Great. Other questions?

    Kelly  29:14 --- Dear Jordan, is there any plan to have variable sync to and from inventory and deploy, it would be nice not to create the same variable in the other program, package version variable and deploy. But I would like to use that same variable in inventory to check for which computers have an out of date package. Thanks, Nick W.

    Jordan  29:35 --- I can't speak on the roadmap specifically, I can't say we have done a webcast out there where we're talking about automating packages that aren't in the package library where we use PowerShell with a SQL query to update both of those based off the name of the file, which kind of get most where you're looking for. It's basically since this, you're building on variables, I assume as for a package, or library, when you update the location for the new install file, if you just name it to that variable name, it should update both Deploy and Inventory. I don't know if I can find that webcast, but we can probably put that in the information below if we need to. It's just I believe it's something

    Lex  30:15 --- I think the title to that one's automating packages that aren't in our package library. Yeah. 

    Jordan  30:20 --- And I believe Colby just put a link in the chat. Running that one, it's kind of a workaround for that one, but it should get mostly what we're looking for. Where you don't have to have  hands on so much. All right. Any other questions? 

    Kelly  30:34 --- Yeah, we have another variable question. Hi, I would like to know if it is possible to make a scheduled task that updates my variables in PDQ inventory. For example, if I want to make a dynamic collection to check if I have the latest version of an application, this would update the variable in the collection uses to a new version value. Thanks, Kenneth N

    Jordan  30:56 --- Absolutely, if there's going to be we have a built in command line tools. So you could run this as command or PowerShell. Just you want to make sure you run the command in PowerShell, specifically, but if you look at PDQ Inventory, it will run that one. You can see the rest of the commands and then one of these Yeah, update custom variable. So yeah, the scheduled tasks can run that to update it. As far as where you're grabbing the information to update it with that's going to be up to you. But you can pipe it into that command line and it will update the variable on the product.

    Kelly  31:35 --- More questions?

    Jordan  31:36 ---  Let's do it

    Kelly  31:37 ---  Alright guys, do you know if there is a way to force windows 10 to be upgraded? For example, from 1903 version to the 2009 version? Is that possible to think about a scheduled task which is able to do that, instead of clicking download and install 20 h2? Thanks Damien s.

    Jordan  31:58 --- For that one, assuming you don't want to use WSUS for those kind of updates, when it comes to feature updates? Yeah, I mean, you can use it, you can kick off whatever script you want with a scheduled task, as far as verifying that it was successful, which is why we don't generally have it in our product, is if you push it with PDQ, it's going to take longer to update that it's not going to report back in time that it was successful. So you just kind of have to make the assumption. But for for PowerShell, there are cmdlets for using updates where you might be able to do the feature, you just you're not going to get the feedback that was accessible that you're hoping for at the end of it.

    Kelly  32:36 --- Alright, we've got a couple more questions for you, Jordan. Okay. How would you trigger and call a PDQ deployment from a user's computer scheduled task?

    Jordan  32:47 --- So I assume this one, the scheduled tasks already exists, but it's not running or you just want to run it. Let's go back to our Git command here.

    Lex  32:58 --- This one, we're turning that end users computer into a admin where we're kicking off PDQ Deploy, am I reading that right?

    Jordan  33:08 --- Um, yeah. So we're just basically, it's basically it's going to be a power show, where you are going to run so set, there's a start scheduled task here. So if you have the name of the scheduled task, you could build a tool in inventory or a package where you do the start scheduled task, make sure you have the name of the schedule, we're going to run and deploy that to the machine, and it should kick off that scheduled task for you.

    Kelly  33:34 --- And our final question. Hi, I'm looking to learn PowerShell where would you recommend I start? Thanks, Jason C.

    Jordan  33:43 --- For this one, I always, my initial recommendation is PowerShell In a Month of Lunches, by Don Jones. I think he has other books out since then, that are probably maybe better to start with. But that's where I learned it. It's a fantastic book. It's an easy read that he goes into the principles and then anything from there, he probably has recommendations, will get you started. It's it's the best way to start that I can think of it gives you everything you need. All right, everybody. Thanks for tuning in, hopefully. I mean, hopefully you all have Group Policy and a lot of this is invalidated but if you do need to set a scheduled tasks, whether for real world examples, or to pop up your dating profile on YouTube on a random computer. Hopefully this gives you everything you know, to get started to get built out for PDQ.com Jordan.

    Kelly  34:33 --- Thanks for joining our webcast today. Congratulations Jason C and Kenneth n are winners of PDQ swag, send us your info at [email protected]. Thanks again for joining us and we'll see you back here next week for PDQ & A.

    34:57 --- [End of Show]

    company JJB
    JJ Bateman

    JJ is a technical creative. He finds joy in programming, automation, and in participating in the artistic sides of things. You'll often find him drinking on Thursdays on the PDQ webcast, rambling and raging remotely at the Bermuda Triangle/heisenbug-tier tech at the studio in SLC.

    Related articles