Solved

PowerShell Logon Script Issue

Posted on 2015-01-21
28
129 Views
Last Modified: 2015-02-11
I am having an issue with the PowerShell Logon Script Below, essentially it runs without errors but it will not map the drives at all. Not sure what I am missing.

Thanks for the help and advice.

$ErrorActionPreference = "SilentlyContinue"
$strName = $env:username
$strComputerName = $env:ComputerName
# ************************************************************
$strADgroupDomainUsers = "Domain Users"
$strADgroupDomainUsers1 = "Domain Users"
$strDomainUsersDrive = "W:"
$strDomainUsers1Drive = "X:"
$strPathToDomainUsersShare = "\\ServerName\DBAPPS$"
$strPathDomainUsers1Share = "\\ServerName2\Groups$"
$strTime = Get-Date -Format "t"
$strDate = Get-Date -format "yyyy-MM-dd"
$strFile = Get-Date -format "yyyy-MM"
$strFileName = "\\FileServer\installs\Logs\"
# ************************************************************
function ListADGroup-Member {
BEGIN{}
PROCESS{
$strFilter = "(&(objectCategory=User)(samAccountName=$_))"
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.Filter = $strFilter
$objPath = $objSearcher.FindOne()
$objUser = $objPath.GetDirectoryEntry()
$strUserHomeDrive = $objUser.sAMAccountName
$DN = $objUser.distinguishedName
$ADVal = [ADSI]"LDAP://$DN"
if (!($ADVal.memberOf.Value -eq $Null)){
$GroupName = $ADVal.memberOf.Value
foreach($gp in $GroupName)
  {
    if($mappingOneDrive.ContainsKey($gp))
    {
    if($gp | Select-String -pattern $strADgroupDomainUsers)
      {if ( !(Get-WmiObject -Class Win32_LogicalDisk -Filter "DeviceID='$strDomainUsersDrive'") )
          {net use /persistent:yes $strDomain UsersDrive $strPathToDomainUsersShare | Out-Null}
    }
    if($gp | Select-String -pattern $strADgroupDomainUsers1)
      {if ( !(Get-WmiObject -Class Win32_LogicalDisk -Filter "DeviceID='$strDomainUsers1Drive'") )
          {net use /persistent:yes $strDomainUsers1Drive $strPathDomainUsers1Share | Out-Null}
    }
}
}
}
}
}
END{
}
# End of function ListADGroup-Member
$strName | ListADGroup-Member
$strFileName += [string]$strFile + ".txt"
$strDate + "," + $strTime + "," + $strName + "," + $strComputerName + "," + "Logon" | Out-File $strFileName -append -Encoding ASCII
0
Comment
Question by:robertarenson
  • 14
  • 14
28 Comments
 
LVL 67

Expert Comment

by:sirbounty
ID: 40563480
There's a lot of reduction that can be realized here by simply using get-aduser (or get-qaduser if you prefer).
But before I continue that route - what is $mappingOneDrive supposed to represent?  It's not declared or used anywhere else in your script...
0
 
LVL 67

Expert Comment

by:sirbounty
ID: 40563483
Just slapping this together without knowing much of the criteria...
$strName = $env:username
$strADgroupDomainUsers = "Domain Users"
$strADgroupDomainUsers1 = "Domain Users"
$strDomainUsersDrive = "W:"
$strDomainUsers1Drive = "X:"
$strPathToDomainUsersShare = "\\ServerName\DBAPPS$"
$strPathDomainUsers1Share = "\\ServerName2\Groups$"
[string]$strFileName = "\\FileServer\installs\Logs\$($(get-date).tostring('yyyy-MM')).txt"
$user = get-aduser $strName -properties *
if ($user.memberof | Where-Object {$_ -like '*someOU*'}) {
    if ( !(Get-WmiObject -Class Win32_LogicalDisk -Filter "DeviceID='$strDomainUsersDrive'") ) {
        net use /persistent:yes $strDomainUsersDrive $strPathToDomainUsersShare | Out-Null
    }
}
"$($(get-date).tostring('yyyy-MM-dd,HH:mm tt')),$strName,$($env:computername),Logon" | Out-File $strFileName -append -Encoding ASCII

Open in new window

0
 

Author Comment

by:robertarenson
ID: 40565003
SirBounty, Am I setting this correctly, still not seeing the map drives occuring

$strName = $env:username
$strADgroupDomainUsers = "Domain Users"
$strADgroupDomainUsers1 = "Domain Users"
$strDomainUsersDrive = "W:"
$strDomainUsers1Drive = "X:"
$strPathToDomainUsersShare = "\\servername\DBAPPS$"
$strPathDomainUsers1Share = "\\servername1\Groups$"
[string]$strFileName = "\\pfreutil01\installs\Logs\$($(get-date).tostring('yyyy-MM')).txt"
$user = get-aduser $strName -properties *
if ($user.memberof | Where-Object {$_ -like '*OU=Security Groups,OU=All Computer and User Groups,DC=domain,DC=name*'}) {
    if ( !(Get-WmiObject -Class Win32_LogicalDisk -Filter "DeviceID='$strDomainUsersDrive'") ) {
        net use /persistent:yes $strDomainUsersDrive $strPathToDomainUsersShare | Out-Null
    }
}
"$($(get-date).tostring('yyyy-MM-dd,HH:mm tt')),$strName,$($env:computername),Logon" | Out-File $strFileName -append -Encoding ASCII
0
 
LVL 67

Expert Comment

by:sirbounty
ID: 40565648
Going back to the above - what is $mappingOneDrive supposed to represent?  
That might help me figure out how you're trying to limit this.

You don't have to specify the entire DN for your query, shorten it to this for example:
if ($user.memberof | Where-Object {$_ -like '*OU=Security Groups*'}) {
At this point, debug by placing a message:
write-host "$strname is a member of Security Groups"
if you make it that far, then it's either stopping because they don't have the drive mapped, or because net use is failing:
   if ( !(Get-WmiObject -Class Win32_LogicalDisk -Filter "DeviceID='$strDomainUsersDrive'") ) {
       net use /persistent:yes $strDomainUsersDrive $strPathToDomainUsersShare | Out-Null

Oftentimes, powershell has difficulty with external commands.
Depending on the version, you can use the stop parsing method, --%
as in:
net use --% /grant Dom\HVAdmin:(CI)(OI)F /persistent:yes $strDomainUsersDrive
which tell powershell to just pass the remainder over to the external command.
Another option to try, is to enclose the parameters in quotes:
net use  "/grant Dom\HVAdmin:(CI)(OI)F /persistent:yes $strDomainUsersDrive "

Give that a shot and let me know.  Good luck!
0
 

Author Comment

by:robertarenson
ID: 40566925
Sorry that was old code that is no longer relevant.

Based off of your suggestions, this is now the whole script:

$strName = $env:username
$strADgroupDomainUsers = "Domain Users"
$strADgroupDomainUsers1 = "Domain Users"
$strDomainUsersDrive = "W:"
$strDomainUsers1Drive = "X:"
$strPathToDomainUsersShare = "\\Server\DBAPPS$"
$strPathDomainUsers1Share = "\\Server1\Groups$"
[string]$strFileName = "\\servername\installs\Logs\$($(get-date).tostring('yyyy-MM')).txt"
$user = get-aduser $strName -properties *
if ($user.memberof | Where-Object {$_ -like '*OU=Security Groups*'}) {
write-host "$strname is a member of Security Groups"
    if ( !(Get-WmiObject -Class Win32_LogicalDisk -Filter "DeviceID='$strDomainUsersDrive'") ) {
        net use /persistent:yes $strDomainUsersDrive $strPathToDomainUsersShare | Out-Null
          }
}
"$($(get-date).tostring('yyyy-MM-dd,HH:mm tt')),$strName,$($env:computername),Logon" | Out-File $strFileName -append -Encoding ASCII

I am seeing the response user is a member of Security Groups

I tried the net use --% /grant Dom\HVAdmin:(CI)(OI)F /persistent:yes $strDomainUsersDrive  but then I get these errors:

At \LogonScriptWHHS2.ps1:23 char:26
+ "$($(get-date).tostring('yyyy-MM-dd,HH:mm
tt')),$strName,$($env:computername),Lo ...
+                          ~~~~~~~~~~
Unexpected token 'yyyy-MM-dd' in expression or statement.
At \LogonScriptWHHS2.ps1:23 char:36
+ "$($(get-date).tostring('yyyy-MM-dd,HH:mm
tt')),$strName,$($env:computername),Lo ...
+                                    ~
Missing argument in parameter list.
At \LogonScriptWHHS2.ps1:23 char:45
+ "$($(get-date).tostring('yyyy-MM-dd,HH:mm
tt')),$strName,$($env:computername),Lo ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~
The string is missing the terminator: '.
At \LogonScriptWHHS2.ps1:18 char:96
+ ... sersDrive'") ) {
+                    ~
Missing closing '}' in statement block.
At \LogonScriptWHHS2.ps1:16 char:70
+ if ($user.memberof | Where-Object {$_ -like '*OU=Security Groups*'}) {
+                                                                      ~
Missing closing '}' in statement block.
    + CategoryInfo          : ParserError: (:) [], ParseException
    + FullyQualifiedErrorId : UnexpectedToken
0
 
LVL 67

Expert Comment

by:sirbounty
ID: 40566971
Tough for me to diagnose the errors when they seem to refer to another script than what you've posted.
The error mentions lines 16,18 & 23 are problematic, yet copying your script from above yields 16 lines total.
Could you point out specifically the lines that the error is referring to?

Also, are these correct?
$strADgroupDomainUsers = "Domain Users"
$strADgroupDomainUsers1 = "Domain Users"

Because they seem to point to the same value?
0
 

Author Comment

by:robertarenson
ID: 40567366
1. $strName = $env:username
2. $strADgroupDomainUsers = "Domain Users"                                    'Trying to get 2 seperate Server Mappings but with the same Domain Group. In this case Domain Users would have Server mapped to W and Server1 mapped to X.'
3. $strADgroupDomainUsers1 = "Domain Users"
4. $strDomainUsersDrive = "W:"
5. $strDomainUsers1Drive = "X:"
6. $strPathToDomainUsersShare = "\\Server\DBAPPS$"
7. $strPathDomainUsers1Share = "\\Server1\Groups$"
8. [string]$strFileName = "\\fileserver\installs\Logs\$($(get-date).tostring('yyyy-MM')).txt"
9. $user = get-aduser $strName -properties *
10. if ($user.memberof | Where-Object {$_ -like '*OU=Security Groups*'}) {
11. write-host "$strname is a member of Security Groups"
12.   if ( !(Get-WmiObject -Class Win32_LogicalDisk -Filter "DeviceID='$strDomainUsersDrive'") ) {
13.      ' net use /persistent:yes $strDomainUsersDrive $strPathToDomainUsersShare | Out-Null
14.        net use --% /grant Dom\HVAdmin:(CI)(OI)F /persistent:yes $strDomainUsersDrive
15.         }
16. }
17. "$($(get-date).tostring('yyyy-MM-dd,HH:mm tt')),$strName,$($env:computername),Logon" | Out-File $strFileName -append -Encoding ASCII

Right now for testing purposes I am only calling server to be mapped to w, if everything works then I will add modified 12, 13 and 15 for server1 X mapping.

Hopefully I am making some sense, never been good at explaining things. :>(

Error:

At \LogonScriptWHHS2.ps1:17 char:26
+ "$($(get-date).tostring('yyyy-MM-dd,HH:mm
tt')),$strName,$($env:computername),Lo ...
+                          ~~~~~~~~~~
Unexpected token 'yyyy-MM-dd' in expression or statement.
At \LogonScriptWHHS2.ps1:17 char:36
+ "$($(get-date).tostring('yyyy-MM-dd,HH:mm
tt')),$strName,$($env:computername),Lo ...
+                                    ~
Missing argument in parameter list.
At \LogonScriptWHHS2.ps1:17 char:45
+ "$($(get-date).tostring('yyyy-MM-dd,HH:mm
tt')),$strName,$($env:computername),Lo ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~
The string is missing the terminator: '.
At \LogonScriptWHHS2.ps1:12 char:96
+ ... sersDrive'") ) {
+                    ~
Missing closing '}' in statement block.
At \LogonScriptWHHS2.ps1:10 char:70
+ if ($user.memberof | Where-Object {$_ -like '*OU=Security Groups*'}) {
+                                                                      ~
Missing closing '}' in statement block.
    + CategoryInfo          : ParserError: (:) [], ParseException
    + FullyQualifiedErrorId : UnexpectedToken
0
 
LVL 67

Expert Comment

by:sirbounty
ID: 40567575
Finally had a chance to test this out today.
Let's start with this and build from here...
First of all, you'll need the DN of the group you're testing against - if that's not the direction you can feasibly go, let me know and I'll adjust the logic back to the where condition used above...this just seemed to make more logical sense for any admins that may look at it later:

$user = $env:username
$DomainUsersDrive = 'W:'
$DomainUsersPath = '\\server\groups$'
[string]$filename = '\\fileserver\installs\logs\$($(get-date).tostring('yyyy-MM')).txt"
if ((get-aduser $user -properties memberof).memberof.contains('DC=Domain Users,CN=Users,dc=company,dc=com')) {
  if (-not (get-wmiobject -class win32_logicaldisk -filter "DeviceID='$DomainUsersDrive'")) {
    net use /persistent:yes $domainUsersDrive $DomainUsersPath
  }
}
"$($(get-date).tostring('yyyy-MM-dd,HH:mm tt')),$user,$($env:computername),Logon" | Out-File $FileName -append -Encoding ASCII

Open in new window

0
 

Author Comment

by:robertarenson
ID: 40570954
I must be doing something wrong, still won't map for me for some reason.

Here is what I have so far based off of your help. I removed the logging part to make things easier for testing.

$user = $env:username
$DomainUsersDrive = 'W:'
$DomainUsersPath = '\\Server\DBAPPS$'
if ((get-aduser $user -properties memberof).memberof.contains('DC=Domain Users,OU=Security Groups,OU=All Computer and User Groups,dc=domain,dc=name')) {
  if (-not (get-wmiobject -class win32_logicaldisk -filter "DeviceID='$DomainUsersDrive'")) {
    net use /persistent:yes $domainUsersDrive $DomainUsersPath
  }
}

Thanks again
0
 
LVL 67

Expert Comment

by:sirbounty
ID: 40571115
At this point, I think we need some sort of logging - I don't know your environment and the above worked for me, so we need to figure out what's working and not in your realm...try this and let me know the results...

$user = $env:username
$DomainUsersDrive = 'W:'
$DomainUsersPath = '\\Server\DBAPPS$'
$Membership = (get-aduser $user -properties memberof)
if ($Membership.contains('DC=Domain Users,OU=Security Groups,OU=All Computer and User Groups,dc=domain,dc=name')) {
write-host "$user is a member"
  if (-not (get-wmiobject -class win32_logicaldisk -filter "DeviceID='$DomainUsersDrive'")) {
    write-host "Drive not mapped"
    net use /persistent:yes $domainUsersDrive $DomainUsersPath
  } else {write-host "Drive already mapped"}
} else {write-host "$User not a member"}

Open in new window

0
 

Author Comment

by:robertarenson
ID: 40571421
Ok, looks like your are pointing me in the right direction, came back as not being a member. The Domain Users Group is a Global Security Group which is within the Security Groups OU, which is within the ALL Computer and User Groups OU. It is acting as if it does not recognize the user group Domain Users.

The OU is structure like this:

domain.com --> All Computer and User Groups --> Security Groups --> Domain Users

I changed the if membership to the following to test but still get not a member of.

if ($Membership.contains("'CN=Domain Users,OU=Security Groups,OU=All Computer and User Groups,dc=whhs,dc=local'")) {
0
 
LVL 67

Expert Comment

by:sirbounty
ID: 40571604
This is a user login script -does the user have permissions to read AD?
0
 

Author Comment

by:robertarenson
ID: 40571734
Yes, domain admin rights. Thanks
0
 
LVL 67

Expert Comment

by:sirbounty
ID: 40571795
Perhaps it's a type-o on my part...sorry about that:

Replace this line
$Membership = (get-aduser $user -properties memberof).memberof

Open in new window

0
How to improve team productivity

Quip adds documents, spreadsheets, and tasklists to your Slack experience
- Elevate ideas to Quip docs
- Share Quip docs in Slack
- Get notified of changes to your docs
- Available on iOS/Android/Desktop/Web
- Online/Offline

 

Author Comment

by:robertarenson
ID: 40574117
Our OU structure must be really messed up.... Made the modification and still get that I am not a member of the group. :>(
0
 
LVL 67

Expert Comment

by:sirbounty
ID: 40574314
You could write $Membership to the screen to see...
But there's another way to filter this, and perhaps a bit easier since we seem to be having trouble with the above.
Try this route - the -like parameter is case INsensitive, so '*domain users*' would work as well, just be sure to use the most unique form (*domain* would include domain admins, for example).
$user = $env:username
$DomainUsersDrive = 'W:'
$DomainUsersPath = '\\Server\DBAPPS$'
$Membership = (get-aduser $user -properties memberof).memberof
if ($Membership -like '*Domain Users*') {
write-host "$user is a member"
  if (-not (get-wmiobject -class win32_logicaldisk -filter "DeviceID='$DomainUsersDrive'")) {
    write-host "Drive not mapped"
    net use /persistent:yes $domainUsersDrive $DomainUsersPath
  } else {write-host "Drive already mapped"}
} else {write-host "$User not a member"}

Open in new window

0
 

Author Comment

by:robertarenson
ID: 40575855
Still the same results. Do you think I may need to do something like add domainname\Domain Users?
0
 
LVL 67

Expert Comment

by:sirbounty
ID: 40576279
Nope - *Domain Users* should match...Is the user indeed a member of Domain Users?
Add the following after this line:
$Membership = (get-aduser $user -properties memberof).memberof
write-host $Membership

What does that show?
0
 

Author Comment

by:robertarenson
ID: 40578075
Thank you sirbounty, that really helped me narrow down what was going on. I found that for some crazy reason our domain users is not propagating correctly. In turn I choose a different security group and walla it worked...

Just another quick question, can I just use a , to add other security groups to the $Membership -like?

Thanks again for all your help

$user = $env:username
$DomainUsersDrive = 'M:'
$DomainUsersPath = '\\servername\3MHIS_Users'
$Membership = (get-aduser $user -properties memberof).memberof
if ($Membership -like '*Users Prod 3M Coder (Users)*,*CS HealthConnect Architecture and Integration Support*,*NOPS EDS TSTC RUN*') {
write-host "$user is a member"
  if (-not (get-wmiobject -class win32_logicaldisk -filter "DeviceID='$DomainUsersDrive'")) {
    write-host "Drive not mapped"
    net use /persistent:yes $domainUsersDrive $DomainUsersPath
  } else {write-host "Drive already mapped"}
} else {write-host "$User not a member"}
0
 
LVL 67

Expert Comment

by:sirbounty
ID: 40578126
In the example above, you would use:

if (($Membership -like '*Users Prod 3M Coder (Users)*') -or ($Membership -like '*CS HealthConnect Architecture and Integration Support*') -or ($Membership -like '*NOPS EDS TSTC RUN*'))

Now if you were looking at users that had to belong to all three groups, we would approach it a bit differently, and perhaps since the OU problem has been sorted, we can return to using the collection ('contains')...
0
 

Author Comment

by:robertarenson
ID: 40578698
I see what you mean. In this testing I was only trying to see if I can get 1 drive mapping (in this case drive M:) to map from multiple user groups. The main script I will need to have multiple drives being mapped via different security groups.
0
 

Author Comment

by:robertarenson
ID: 40579973
I updated the testing script with the changes that you suggested and I am now seeing just a few minor errors with missing statement blocks after the if statement.

Modified Script:

1. $user = $env:username
2. $DomainUsersDrive = 'M:'
3. $DomainUsersPath = '\\servername\3MHIS_users'
4. $Membership = (get-aduser $user -properties memberof).memberof
5. if ($Membership -like '*Users Prod 3M Coder (Users)*') -or ($Membership -like '*CS HealthConnect Architecture and Integration Support*') -or ($Membership -like '*NOPS EDS TSTC RUN*')
6.  if (-not (get-wmiobject -class win32_logicaldisk -filter "DeviceID='$DomainUsersDrive'"))
7.  net use /persistent:yes $domainUsersDrive $DomainUsersPath

I know the reason for the error is because I had to remove the

write-host "$user is a member" and write-host "Drive not mapped" because I did not want the users to get any prompts.

Error:

At C:\Users\Desktop\LogonScript3MHIS.ps1:5 char:53
+ if ($Membership -like '*NCAL Prod 3M Coder (Users)*') -or ($Membership -like '*C ...
+                                                     ~
Missing statement block after if ( condition ).
At C:\Users\Desktop\LogonScript3MHIS.ps1:6 char:91
+ ... inUsersDrive'"))
+                    ~
Missing statement block after if ( condition ).
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MissingStatementBlock

I tried updating it but still get the same error:

{if ($Membership -like '*User Prod 3M Coder (Users)*') -or ($Membership -like '*CS HealthConnect Architecture and Integration Support*') -or ($Membership -like '*NOPS EDS TSTC RUN*')
{net use /persistent:yes $domainUsersDrive $DomainUsersPath}
}
else
  {if (-not (get-wmiobject -class win32_logicaldisk -filter "DeviceID='$DomainUsersDrive'")) }

Thanks again
0
 
LVL 67

Accepted Solution

by:
sirbounty earned 500 total points
ID: 40580070
That's not why - write-host simply displays output to the screen.
You've inadvertently removed your curly-brackets for the code blocks.
And remember, the -like parameter just needs whatever portion of the text is uniqe.  If there are no other groups with 3M Coder in the name, you can shorten that, as I've shown here:
$user = $env:username
$DomainUsersDrive = 'M:'
$DomainUsersPath = '\\servername\3MHIS_users'
$Membership = (get-aduser $user -properties memberof).memberof
if (($Membership -like '*3M Coder*') -or ($Membership -like '*Connect Architect*') -or ($Membership -like '*EDS TSTC*') 
) {
 if (-not (get-wmiobject -class win32_logicaldisk -filter "DeviceID='$DomainUsersDrive'")) {
 net use /persistent:yes $domainUsersDrive $DomainUsersPath
}
}

Open in new window

0
 

Author Comment

by:robertarenson
ID: 40580418
Thanks Sirbounty, that worked perfectly for the testing.

Is there an easy way to add additional membership and membership like statements that would point to different user drive paths?

Thanks

Brian
0
 
LVL 67

Expert Comment

by:sirbounty
ID: 40580601
While i have yet to write or need a logon script in powershell, I would envision something along the lines of a hashtable to support those decisions.
For example:
$Staff = @{'S:'='\\server1\StaffShare'}
$Management = @{'M:'='\\server3\PrivateShare$'}
etc.

But in your logon script, you'll need to determine which groups are required to get those mappings.  I'm not familiar enough to say, but I think you have the basics for that above (though I can certainly help with more detail).
So it could end up in a switch case like:

switch ($membersip) {
  ($_ -like '*Manager*') {$mapping += $Management} #Add mapping for management
  {$_ -like '*Accounting*'} {$mapping += $Accounting} #Add mapping for Accounting
  default {$mapping += $staff} #Mapping that everyone receives, regardless of membership
}

Then after you've established all of the appropriate mappings, you would loop through those results with your net use command:
foreach ($map in $mappings) {net use $($map.name) $($map.value) /persist:yes }
#Untested, but I think that should work...
0
 

Author Comment

by:robertarenson
ID: 40587481
Thanks for the push in the right direction, I will begin modifying and testing the script and let you know the results. Thanks again.
0
 

Author Closing Comment

by:robertarenson
ID: 40603571
Thanks again Sirbounty. Closing this initial question since you have already helped fix this request.
0
 
LVL 67

Expert Comment

by:sirbounty
ID: 40603922
Glad to hear it's resolved to your satisfaction.  Good luck fine tuning your logon script and venturing out on more fun powershell projects! :^)
0

Featured Post

Free Trending Threat Insights Every Day

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

Join & Write a Comment

Microsoft Windows Server Update Service (WSUS) is free for everyone, but it lacks of some desirable features like send an e-mail to the administrator with the status of all computers on the WSUS server. This article is based on my PowerShell script …
This article explains how to prepare an HTML email signature template file containing dynamic placeholders for users' Azure AD data. Furthermore, it explains how to use this file to remotely set up a department-wide email signature policy in Office …
Internet Business Fax to Email Made Easy - With eFax Corporate (http://www.enterprise.efax.com), you'll receive a dedicated online fax number, which is used the same way as a typical analog fax number. You'll receive secure faxes in your email, fr…
Polish reports in Access so they look terrific. Take yourself to another level. Equations, Back Color, Alternate Back Color. Write easy VBA Code. Tighten space to use less pages. Launch report from a menu, considering criteria only when it is filled…

706 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

20 Experts available now in Live!

Get 1:1 Help Now