Nachdem ich bei dem Passwort für einen Blattschutz gescheitert bin, habe ich mich natürlich auf die Suche gemacht, wie man diesen umgehen kann.

Dann bin ich auf diesen guten Artikel gestoßen, der die folgende Lösung sehr einfachen beschreibt:

Sub pcwBreaker()

Dim i As Integer, j As Integer, k As Integer
Dim l As Integer, m As Integer, n As Integer
Dim i1 As Integer, i2 As Integer, i3 As Integer
Dim i4 As Integer, i5 As Integer, i6 As Integer
On Error Resume Next
For i = 65 To 66: For j = 65 To 66: For k = 65 To 66
For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66
For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66
For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126

Kennwort = Chr(i) & Chr(j) & Chr(k) & Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
ActiveSheet.Unprotect Kennwort
If ActiveSheet.ProtectContents = False Then
MsgBox "Fertig" & vbcr & "Das alternative Kennwort lautet:" & vbcr & Kennwort
Exit Sub
End If
Next: Next: Next: Next: Next: Next
Next: Next: Next: Next: Next: Next

End Sub

Dieses VBA Script bindet man folgendermaßen in Excel ein:

Zuerst öffnet Ihr mal das Dokument mit dem Blattschutz.
Anschliessend drückt man ALT+F11 (öffnet den VB Editor).
Jetzt das Skript mit Copy & Paste übertragen.
(Falls das Code Fenster noch nicht offen ist, einfach F7 drücken).

Nach wenigen Sekunden hat man den Blattschutz aufgehoben.


Wenn dir dieser Artikel gefallen hat, kannst du ihn mit einem Klick auf die folgenden Buttons weiterempfehlen. Möchtest du in Zukunft keine neuen Beiträge mehr verpassen? Dann abonniere doch den RSS Feed dieses Blogs. Vielen Dank!

IMG 0735

Es gibt verschiedene Möglichkeiten Benutzern das Recht für die Passwortzurücksetzung zu erteilen. Doch hat jede Variante seine Vor- und Nachteile.

Zum Hintergrund:

Es existiert eine Domäne, worin mehrere Kunden in OU’s unterteilt sind. Die Anfrage eines Kunde war, ob es nicht möglich wäre, dass er für seine Kollegen die Passwörter selbst zurücksetzen kann. Dies ist natürlich möglich, aber ich wollte, dass der Kunde wirklich nur die Passwörter zurücksetzen kann und nicht die anderen Kundennamen o.ä. sieht.

Methode 1:

Zuerst versuchte ich dies über eine angepasste MMC-Konsole (eine bebilderte Anleitung findet ihr z.B. auf petenetlive.com). Leider hat dies zum einen den Nachteil, dass die AD-Tools auf der Kundenmaschine installiert werden muss und zum anderen, dass der Kunde die Domäne und somit die anderen Kundennamen sieht. Dies ist leider unvermeidbar, weil man in den angepassten MMC-Konsolen nicht das Kontextmenü ausblenden kann. Im Kontextmenü gibt es den Punkt “verschieben”, so dass hierüber wieder alle Kunden-OUs für den Kunden sichtbar wären. Jedes Objekt in der AD hat zumindest Leseberechtigung auf die gesamte Domäne.

view2

Damit war diese Lösung nicht optimal.

Methode 2:

Die zweite Wahl fiel auf ein kleine Eigenentwicklung. Diese “Lösung” ist in zwei Teile gesplittet.

  1. Die Rechte für die Benutzer vergeben
  2. Das Tool für die Rücksetzung zur Verfügung stellen

1. Rechte vergeben

Erstellt in der Kunden OU eine neue Sicherheitsgruppe. Dann ein Rechtsklick auf die Kunden OU und “Objektverwaltung zuweisen…” auswählen. In dem Assistenten wählt ihr die zuvor erstelle Sicherheitsgruppe aus. Bei den Aufgaben wird der Haken bei “Setzt Benutzerkennwörter zurück und erzwingt Kennwortänderung bei der nächsten Anmeldung”.

Dies war der erste Part. Zu Testzwecken solltet ihr noch einen Benutzer der Gruppe hinzufügen.

2. Tool: Powershell GUI

So sieht es aus:

PWReset

Der Kunde bekommt alle Benutzer in der definierten OU angezeigt und kann ganz simpel über einen Button das Passwort zurücksetzen. Die vordefinierte OU ist im Skript hinterlegt und muss natürlich angepasst werden.

$root = [ADSI]“LDAP://dc:389/ou=Kunde1,OU=Companies,dc=domain,dc=com”

Zusätzlich habe ich beim Kunden eine Batchdatei auf den Desktop gelegt, damit das Powershellfenster nicht angezeigt wird.

Batch-Inhalt:

@echo off

C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe -psconsolefile “C:\Program Files\Quest Software\Management Shell for AD\ConsoleSettings.psc1″ -noexit -Windowstyle Hidden -command “. ‘D:\Reset-Password.ps1′” -windowstyle hidden

Powershell GUI Download: Reset-Password


Wenn dir dieser Artikel gefallen hat, kannst du ihn mit einem Klick auf die folgenden Buttons weiterempfehlen. Möchtest du in Zukunft keine neuen Beiträge mehr verpassen? Dann abonniere doch den RSS Feed dieses Blogs. Vielen Dank!

A few days ago I searched for a solution to administrate contacts for several Lync 2010 users. Sorry for my english.

I found the great VBS script LyncAddContacts from Jeff on this website: expta.com. Very great tool, I appreciate Jeff’s work. But the fact of the matter that I’m familiar with Powershell, I wonder whether it is possible with Powershell and I can use my well-loved pipeline.

As the original script you have to use the DBIMPEXP utility from the Lync 2010 server to import and export contacts.

I quote the description from expta.com:

The purpose of Add-LyncContacts is to add the same contact groups and contacts to multiple users programmatically.

For example, you may want to import a contact group called “Company Contacts” that contains contacts for everyone in the company.

Here’s how it works:lync

  1. Create a template (source) user in Lync with the contact groups and contacts that you want to export.
  2. Import the powershell module Add-LyncContacts.psm1
  3. Execute the cmdlet “New-CSContactExport” to export the source user’s contacts and groups
  4. Execute the cmdlet “New-CSContactImport” to import the contact/group template to one or more users.

Prerequisites:

  • You have to run the cmdlets on the Lync server from which you will export/import the data.
  • You must be a member of the CSAdministrator security group to run this tool. This group has rights to export and import contact groups and contacts to all users.
  • You must copy the DBIMPEXP.EXE tool from the \Support folder on the Lync Server 2010 installation media to the same folder where you call the Add-LyncContacts-Modul cmdlets.
  • You must have read, write and execute rights to the folder where the Add-LyncContacts-Modul cmdlets will be called, because the script will create temporary files for editing.

Usage:

  • Start Powershell with Administrator rights.
  • Import-Module Add-LyncContacts.psm1
  • Navigate to the folder where you can find the DBIMPEXP.EXE utility
  • If you use Lync Server Enterprise Edition then you have to set the required SQL server parameter

To backup all user data to a specific filename, use the following cmdlet:

New-CSContactBackup -FileName backup.xml

For the Lync Server Enterprise Edition the cmdlet will be executed like this:

New-CSContactBackup -FileName backup.xml -SQLServer sql.domain.com

where backup.xml is the backup filename and sql.domain.com is the SQL server used by the front-end pool.

Once the backup has been performed, you can begin the export/import process. First, you must export the source user’s contact groups and contacts. The following example exports this information from a user named “test” on a Lync Standard Edition server:

New-CSContactExport -SIPName test@lync.local -FileName: testExport.xml

where test@lync.local is the SIP address of the user you want to export and textExport.xml is the exported file. For a Lync Enterprise Edition server use the -SQLServer parameter.

Second, you import the contact groups and contacts to one or more user(s). The following example imports the data to a user named “test” on a Lync Standard Edition server:

New-CSContactImport -SIPName test@lync.local -FileName: testExport.xml

Lync Server Enterprise Edition:

New-CSContactImport -SIPName <a href="mailto:test@lync.local">test@lync.local</a> -FileName: testExport.xml -SQLServer:sql.lync.local

The followings two examples import the same contact groups and contacts to several SIP enabled users:

Example 1: Users from a txt file

Get-Content users.txt | New-CSContactImport -FileName contacts.xml

where the txt file looks like this:

test1@lync.local

test2@lync.local

Example 2: Get users from the ActiveDirectory

Import-Module ActiveDirectory

Get-ADUser -Filter * -Properties msRTCSIP-PrimaryUserAddress | ?{$_."msRTCSIP-PrimaryUserAddress" -ne $null} | Select-Object @{label='SIPName';Expression={$_."msRTCSIP-PrimaryUserAddress"}} | New-CSContactImport -FileName contacts.xml

where contacts.xml is the source template for the contact groups and contacts.

A nice benefit of this tool is that contacts will not get a notification that so-and-so has added them to their contact list. This is really useful in preventing unnecessary pop-ups from the Lync client.

Special thanks go to Jeff from expta.com.

Powershell Module Download: Add-LyncContacts


Wenn dir dieser Artikel gefallen hat, kannst du ihn mit einem Klick auf die folgenden Buttons weiterempfehlen. Möchtest du in Zukunft keine neuen Beiträge mehr verpassen? Dann abonniere doch den RSS Feed dieses Blogs. Vielen Dank!

Ich bin im Script Explorer von Microsoft auf ein Skript gestoßen, welches den täglichen Durchsatz von gesendeten und empfangenen Emails anzeigt.

Das Ergebnis wird direkt in der Powershellkonsole angezeigt. Da dies sehr unübersichtlich ist, habe ich das Skript angepasst, um das Ergbnis wahlweise als csv, html oder per Email ausgeben zu lassen. Außerdem wurde ein Parameter implementiert, ab welchen Datum die Auswertung starten soll.

Beispielausgabe als HTML:

totalemail

Aufruf des Skripts:

./Totalemail.ps1 -startDate 20/05/2012 -HTML -email -csv

Für den Emailversand müssen folgenden Zeilen angepasst werden:

$sendAlertTo = “EmpfängerEmailAdresse”

$sendAlertFrom = “AbsenderEmailAdresse

$SMTPServer = “SMTP-Server”

Und hier nun das Skript:

# Initialize some variables used for counting and for output
param([string] $startDate = $(throw "Startdate is required"), [switch]$HTML, [switch]$email, [switch]$csv )
$From = Get-Date $startDate
$To = $From.AddDays(1) 

$sendAlertTo = "EmailEmpfänger"
$sendAlertFrom = "Emailabsender"
$SMTPServer = "SMTP-Server" 

$RptCollection = @()  

[Int64] $intSent = $intRec = 0
[Int64] $intSentSize = $intRecSize = 0
[String] $strEmails = $null 

Write-Host "DayOfWeek,Date,Sent,Sent Size,Received,Received Size" -ForegroundColor Yellow 

Do
{
	$rptObj = "" | select  DayOfWeek,Date,Sent,SentSize,Received,ReceivedSize
    # Start building the variable that will hold the information for the day
    $strEmails = "$($From.DayOfWeek),$($From.ToShortDateString()),"
 	$rptObj.DayOfWeek = $From.DayOfWeek
	$rptObj.Date = $From.ToShortDateString()

    $intSent = $intRec = 0
    (Get-TransportServer) | Get-MessageTrackingLog -ResultSize Unlimited -Start $From -End $To | ForEach {
        # Sent E-mails
        If ($_.EventId -eq "RECEIVE" -and $_.Source -eq "STOREDRIVER")
		{
			$intSent++
			$intSentSize += $_.TotalBytes
		}

        # Received E-mails
        If ($_.EventId -eq "DELIVER")
		{
			$intRec++
			$intRecSize += $_.TotalBytes
		}
    } 

	$intSentSize = [Math]::Round($intSentSize/1MB, 0)
	$intRecSize = [Math]::Round($intRecSize/1MB, 0)

 	$rptObj.Sent = $intSent
	$rptObj.SentSize = $intSentSize
	$rptObj.Received = $intRec
	$rptObj.ReceivedSize = $intRecSize

	$RptCollection +=$rptObj  

    # Add the numbers to the $strEmails variable and print the result for the day
    $strEmails += "$intSent,$intSentSize,$intRec,$intRecSize"
    $strEmails 

    # Increment the From and To by one day
    $From = $From.AddDays(1)
    $To = $From.AddDays(1)
}
While ($To -lt (Get-Date))
#While ($To -lt (Get-Date "01/12/2011"))

#if csv parameter is set, create csv file
if($csv)
{
	$RptCollection | Export-Csv -NoTypeInformation  c:\usageReport.csv
}

#Create new Object to build the html code
$sb = New-Object System.Text.StringBuilder

	$css = @'
	<style type="text/css">
	body { font-family: Tahoma, Geneva, Verdana, sans-serif;}
	table {border-collapse: separate; background-color: #F2F2F2; border: 3px solid #103E69; caption-side: bottom;}
	td { border:1px solid #103E69; margin: 3px; padding: 3px; vertical-align: top; color: #000;font-size: 12px;}
	thead th {background: #903; color:#fefdcf; text-align: left; font-weight: bold; padding: 3px;border: 1px solid #990033;}
	th {border:1px solid #CC9933; padding: 3px;}
	tbody th:hover {background-color: #fefdcf;}
	th a:link, th a:visited {color:#903; font-weight: normal; text-decoration: none; border-bottom:1px dotted #c93;}
	caption {background: #903; color:#fcee9e; padding: 4px 0; text-align: center; width: 40%; font-weight: bold;}
	tbody td a:link {color: #903;}
	tbody td a:visited {color:#633;}
	tbody td a:hover {color:#000; text-decoration: none;
	}
	</style>
'@	

		[void]$sb.AppendLine($css)
		[void]$sb.AppendLine("<table cellspacing='0'>")
		[void]$sb.AppendLine("<tr><td colspan='6' bgcolor=`"#F2F2F2`"><strong>Mailbox Auslastung am $((get-date).ToShortDateString())</strong></td></tr>")
		[void]$sb.AppendLine("<tr>")
		[void]$sb.AppendLine("<td><strong>DayOfWeek</strong></td>")
		[void]$sb.AppendLine("<td><strong>Date</strong></td>")
		[void]$sb.AppendLine("<td><strong>Sent</strong></td>")
		[void]$sb.AppendLine("<td><strong>SentSize</strong></td>")
		[void]$sb.AppendLine("<td><strong>Received</strong></td>")
		[void]$sb.AppendLine("<td><strong>ReceivedSize</strong></td>")
		[void]$sb.AppendLine("</tr>")

		$RptCollection | ForEach-Object{

			[void]$sb.AppendLine("<tr>")
			[void]$sb.AppendLine("<td>$($_.DayOfWeek)</td>")
			[void]$sb.AppendLine("<td>$($_.Date)</td>")
			[void]$sb.AppendLine("<td>$($_.Sent) items</td>")
			[void]$sb.AppendLine("<td>$($_.SentSize) MB</td>")
			[void]$sb.AppendLine("<td>$($_.Received) items</td>")
			[void]$sb.AppendLine("<td>$($_.ReceivedSize) MB</td>")
			[void]$sb.AppendLine("</tr>")

		}

	[void]$sb.AppendLine("</table>")
	#Write-Output $sb.ToString()

#if html parameter is set, create html file
if($HTML)
{
	$sb.ToString() | out-file "C:\report.htm"
	Invoke-Expression "C:\report.htm"
}

#if email parameter is set, create email notification
if($email)
{
	$SmtpClient = new-object system.net.mail.smtpClient
	$SmtpClient.host =  $SMTPServer
	$MailMessage = new-object System.Net.Mail.MailMessage
	$MailMessage.To.Add($sendAlertTo)
	$MailMessage.From = $sendAlertFrom
	$MailMessage.Subject = "Exchange Daily Send/Receive - Status"
	$MailMessage.IsBodyHtml = $TRUE
	$MailMessage.body = $sb.ToString()
	$SMTPClient.Send($MailMessage)
}

Wenn dir dieser Artikel gefallen hat, kannst du ihn mit einem Klick auf die folgenden Buttons weiterempfehlen. Möchtest du in Zukunft keine neuen Beiträge mehr verpassen? Dann abonniere doch den RSS Feed dieses Blogs. Vielen Dank!

Damit ich in die Zukunft über die Postfach Auslastung automatisch informiert werde, habe ich das bekannte Script aus dem Beitrag: [SCRIPT]MAILBOX GRÖSSE IM VERGLEICH ZUM QUOTA/KONTINGENT noch ein wenig angepasst.

Man kann jetzt über die Parameter -HTML -csv -email entscheiden, wie das Script das Ergebnis präsentieren soll (Parameter sind kombinierbar).

Das HTML Ergebnis sieht so aus (sortiert nach Mailboxgröße):auslastung

Damit ich monatlich über das Ergebnis informiert werde, habe ich eine Windows Aufgabe auf dem Exchange Server erstellt, die folgende Batch-Datei aufruft:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -command “. ‘C:\Program Files\Microsoft\Exchange Server\V14\bin\RemoteExchange.ps1′; Connect-ExchangeServer -auto; Get-MailboxQuotaUsage.ps1 -email”

Für den email Versand müssen diese Variablen im Script angepasst werden:

$sendAlertTo = “empfänger@report.de
$sendAlertFrom = abenderadresse@report.de
$SMTPServer = “SMTP-Server IP-Adresse”

Zum Schluß das überarbeitete Script:

## Comparsion MailboxSize and Quota Script written by Marius Schloten
##
param([string]$customAttribute = "", [switch]$HTML, [switch]$email, [switch]$csv )
$RptCollection = @()
$cattribute = ""

$sendAlertTo = "Empfänger@email.com"
$sendAlertFrom = "Absender@email.com"
$SMTPServer = "smtp-server-adresse"

function CovertBitValue($String){
    $numItempattern = '(?=\().*(?=bytes)'
    $matchedItemsNumber = [regex]::matches($String, $numItempattern)
    $Mb = [INT64]$matchedItemsNumber[0].Value.Replace("(","").Replace(",","")
    return [math]::round($Mb/1048576,0)
}  

#In my case we filter some users with the customAttribute1, you can use this
#parameter. If there is no parameter all mailboxes will be used
if ($customAttribute -eq "") {

    'No Parameter! customAttribute is not set. Getting all mailboxes and writing log-File to C:\usageReport.csv'
    'Optional Usage:'
    './Get-MailboxQuotaUsage.ps1 with customAttribute1 (e.g. "CompanyName") or/and HTML/csv/email Output'
    ''
	'./Get-MailboxQuotaUsage.ps1 -customAttribute "contoso" -HTML -csv -email'
	''
	$cattribute = "*"
}
else{
$cattribute = $customAttribute
}

#Get-Mailboxes, with or without 'customAttribute1'
$mailboxes = Get-Mailbox -ResultSize Unlimited | ?{$_.customattribute1 -like $cattribute}  

$mailboxes | ForEach-Object{   

$username = $_.SamAccountName
$MailboxName = $_.Name.ToString()
"Processing Mailbox : " + $MailboxName  

$rptObj = "" | select  MailboxName,Mailboxsize,SetQuota,customAttribute
$rptObj.MailboxName = $MailboxName 

if($_.ProhibitSendQuota -eq "unlimited")
{
	$rptObj.SetQuota = $_.Database | Get-MailboxDatabase | %{$_.ProhibitSendQuota}
}
else{
	$rptObj.SetQuota = $_.ProhibitSendQuota
 }

$MailboxStats = Get-MailboxStatistics $username
$ts = CovertBitValue($MailboxStats.TotalItemSize.ToString())
"Total Size : " + $MailboxStats.TotalItemSize
$rptObj.MailboxSize = $MailboxStats.TotalItemSize
#"SetQuota : " + $_.ProhibitSendQuota
"SetQuota : " + $rptObj.SetQuota
$rptObj.customAttribute = $_.customattribute1

$RptCollection +=$rptObj  

}
#if csv parameter is set, create csv file
if($csv)
{
	$RptCollection = $RptCollection | Sort-Object MailboxSize -Descending
	$RptCollection | Export-Csv -NoTypeInformation  c:\usageReport.csv
}

#Create new Object to build the html code
$sb = New-Object System.Text.StringBuilder

	$css = @'
	<style type="text/css">
	body { font-family: Tahoma, Geneva, Verdana, sans-serif;}
	table {border-collapse: separate; background-color: #F2F2F2; border: 3px solid #103E69; caption-side: bottom;}
	td { border:1px solid #103E69; margin: 3px; padding: 3px; vertical-align: top; color: #000;font-size: 12px;}
	thead th {background: #903; color:#fefdcf; text-align: left; font-weight: bold; padding: 3px;border: 1px solid #990033;}
	th {border:1px solid #CC9933; padding: 3px;}
	tbody th:hover {background-color: #fefdcf;}
	th a:link, th a:visited {color:#903; font-weight: normal; text-decoration: none; border-bottom:1px dotted #c93;}
	caption {background: #903; color:#fcee9e; padding: 4px 0; text-align: center; width: 40%; font-weight: bold;}
	tbody td a:link {color: #903;}
	tbody td a:visited {color:#633;}
	tbody td a:hover {color:#000; text-decoration: none;
	}
	</style>
'@	

		[void]$sb.AppendLine($css)
		[void]$sb.AppendLine("<table cellspacing='0'>")
		[void]$sb.AppendLine("<tr><td colspan='6' bgcolor=`"#F2F2F2`"><strong>Mailbox Auslastung am $((get-date).ToShortDateString())</strong></td></tr>")
		[void]$sb.AppendLine("<tr>")
		[void]$sb.AppendLine("<td><strong>MailboxName</strong></td>")
		[void]$sb.AppendLine("<td><strong>Mailboxsize</strong></td>")
		[void]$sb.AppendLine("<td><strong>SetQuota</strong></td>")
		[void]$sb.AppendLine("<td><strong>customAttribute</strong></td>")
		[void]$sb.AppendLine("</tr>")

		$RptCollection = $RptCollection | Sort-Object MailboxSize -Descending
		$RptCollection | ForEach-Object{

			[void]$sb.AppendLine("<tr>")
			[void]$sb.AppendLine("<td>$($_.MailboxName)</td>")
			[void]$sb.AppendLine("<td>$($_.Mailboxsize)</td>")
			[void]$sb.AppendLine("<td>$($_.setQuota)</td>")
			[void]$sb.AppendLine("<td>$($_.customattribute)</td>")
			[void]$sb.AppendLine("</tr>")

		}

	[void]$sb.AppendLine("</table>")
	#Write-Output $sb.ToString()

#if html parameter is set, create html file
if($HTML)
{
	$sb.ToString() | out-file "C:\report.htm"
	Invoke-Expression "C:\report.htm"
}

#if email parameter is set, create email notification
if($email)
{
	$SmtpClient = new-object system.net.mail.smtpClient
	$SmtpClient.host =  $SMTPServer
	$MailMessage = new-object System.Net.Mail.MailMessage
	$MailMessage.To.Add($sendAlertTo)
	$MailMessage.From = $sendAlertFrom
	$MailMessage.Subject = "AMS Exchange Status"
	$MailMessage.IsBodyHtml = $TRUE
	$MailMessage.body = $sb.ToString()
	$SMTPClient.Send($MailMessage)
}

Wenn dir dieser Artikel gefallen hat, kannst du ihn mit einem Klick auf die folgenden Buttons weiterempfehlen. Möchtest du in Zukunft keine neuen Beiträge mehr verpassen? Dann abonniere doch den RSS Feed dieses Blogs. Vielen Dank!

Pages: Prev 1 2 3 4 5 6 7 8 9 10 ...26 27 28 Next