Quantcast
Channel: Windows PowerShell Forum
Viewing all 2314 articles
Browse latest View live

Ergebnis umleiten, Verständnisfrage

$
0
0

moin,

ich newbie habe ein verständnisfrage. Bitte so erklären, das ich es künftig über die Powershell HIlfe selbst herausfinden kann.

Get-MoveRequest | Remove-MoveRequest

lässt sich nach remove-MoveRequest umleiten

https://technet.microsoft.com/de-de/library/dd335149(v=exchg.160).aspx

Der Parameter Identity gibt die Identität des Postfach- oder E-Mail-Benutzers an. Folgende Werte können verwendet werden:

  • GUID

  • Distinguished Name (DN)

  • Domäne\Konto

  • Benutzerprinzipalname (User Principal Name, UPN)

  • Legacy-Exchange-DN

  • SMTP-Adresse

  • Alias

warum kann ich dann

https://technet.microsoft.com/en-us/library/dd335145%28v=exchg.160%29.aspx?f=255&MSPPError=-2147217396

get-mailbox -database user | set-mailboxSearch  

nicht umleiten. Schaut doch beides sehr ähnlich aus. Mit get-mailbox erhalte ich wie oben die Namen und Alias

The SourceMailboxes parameter specifies the mailboxes to be searched.  You can use any value that uniquely identifies the mailbox.

For example:

  • Name

  • Display name

  • Alias

  • Distinguished name (DN)

  • Canonical DN

  • Email address

  • GUID

es geht nur so

Set-MailboxSearch "Hold" -SourceMailboxes (Get-Mailbox -Database user | Select-Object -ExpandProperty Name)


Chris


Klammer vs pipe

$
0
0

hallo

worin liegt hier der unterschied?

get-process | fl id

oder

(get-process).id


Chris

Powershell 3.0, -eq -like

$
0
0

moin,

ist das ein BUG? Der Befehl ist aus der TechNet HIlfe

https://technet.microsoft.com/en-us/library/jj863439(v=exchg.150).aspx

Get-MailboxStatistics -database huser | Where {$_.DisconnectReason -eq "Disabled"}| ft DisplayName,Database,DisconnectDate,disconnectreason

kein Ergebniss

Get-MailboxStatistics -database huser | Where {$_.DisconnectReason -like "Disabled*"}| ft DisplayName,Database,DisconnectDate,disconnectreason

liefert korrekt ein Ergebnis

noch ein kurze Frage: seit Powershell 3.0 sollte ja $DisconnectReason als Schreibweise möglich sein?


Chris

Set-ACL, FileSystemRights werden nicht gesetzt

$
0
0

Ich möchte gerne von einem Pfad auf Server A die ACL kopieren und auf einem Pfad auf Server B einfügen. Dafür habe ich eine PowerShell function geschrieben.

Erst hatte ich etwas rudimentäres probiert in diesem stil get-acl C:\serverA\inetpub | set-acl D:\serverB\inetpubDas kann jedoch nicht funktionieren, da "IUSR, IISAPPPOOL virtual accounts etc. are all local to the machine's Security Account Manager database. They don't exist across multiple servers."

Deshalb schreibe ich mir in meiner Function nun alles raus was get-acl outputet. Mein Problem ist nun, dass die FileSystemRights einfach nicht übernommen werden. Ich habe es auch mal mit 2 lokalen Pfaden auf meinem C:\ probiert, auch dort werden die FileSystemRights nicht übernommen. Der User wird aber erstellt in der ACL, jedoch ohne Berechtigung. (Bsp, auf Server A Pfad X hat IUSR "Read, Write" Berechtigung, auf Server B Pfad Y hat der User noch keine Berechtigung, er wird nun hinzugefügt, das "Read, Write" wird jedoch nicht deployed)

Hier der Code:

function Equate-ACL {
param(
    [Parameter(Mandatory=$true,Position=0)]
    [string]$SourcePath,
    [Parameter(Mandatory=$true,Position=1)]
    [string]$DestinationPath
)
Begin {
    # Check if path exists and if access rights are correct
    if(!(Test-Path $SourcePath)) {
    Throw "Source Path does not exist or you don't have access rights."
    }
    if(!(Test-Path $DestinationPath)) {
    Throw "Destination Path does not exist or you don't have access rights."
    }
}
Process {
# get ACL from source path
    $gacl = get-acl $SourcePath | select -ExpandProperty Access | % {
    $ErrorActionPreference = "SilentlyContinue"
    [string]$user = ($_.IdentityReference).Value.split('\')[1]
    $AccessType = $_.AccessControlType
    $FSRights = $_.FileSystemRights

    if (!$user) { Write-Warning "User not found. Skipping ACL settings for this user.
                                 Username: $(($_.IdentityReference).Value)`n"}
    else{
    # Create ACL Object
    $colRights = [System.Security.AccessControl.FileSystemRights]$FSRights
    $InheritanceFlag = [System.Security.AccessControl.InheritanceFlags]::None
    $PropagationFlag = [System.Security.AccessControl.PropagationFlags]::None
    $objType =[System.Security.AccessControl.AccessControlType]$AccessType
    $objUser = New-Object System.Security.Principal.NTAccount($user)
    $objACE = New-Object System.Security.AccessControl.FileSystemAccessRule `
              ($objUser, $colRights, $InheritanceFlag, $PropagationFlag, $objType)

    # Set the ACL
    Write-Host "Setting ACL for User: $User on $DestinationPath" -ForegroundColor Green
    $objACL = get-acl $DestinationPath
    $ErrorActionPreference = "Stop"
    Try {
        $objACL.AddAccessRule($objACE)
        $objACL | set-acl $DestinationPath
        Write-Host "Success!`n" -ForegroundColor Green
    } Catch {
        Write-Host "Failed! ErrorMessage:" -ForegroundColor Red
        $_.Exception.Message
    }}
}}}

Ich habe ernsthaft das Gefühl das ich hier Pionier-Arbeit leiste, da mir Google, Stackoverflow etc. keine Antwort auf meine Frage geben können. Das Technet ist also mein "Last Resort"

Danke und Grüsse

Simon

Return PSCustomObject Problem

$
0
0

Hallo,

wenn ich folgenden Code ausführe bekomme ich den String "test123" ausgegeben.

function test1 { $test = New-Object PSObject $test | Add-Member -MemberType NoteProperty -Name "a" -Value "test123" $test | Add-Member -MemberType NoteProperty -Name "b" -Value "test456" return $test } $var1 = test1 $var1.a

Dieses Prinzip habe ich auf etwas komplexeres angewandt und bekomme nun nichts mehr zurückgegeben.

function test2
{
    [IO.FileInfo]$FilePath = "PFAD ZU EINER BELIEBIGEN MSI DATEI"
    $PropertyList = @("ProductCode","ProductVersion","ProductName")
    $ReturnObject = New-Object PSObject

    Try
    {
        $WindowsInstaller = New-Object -ComObject WindowsInstaller.Installer
        $MSIDatabase = $WindowsInstaller.GetType().InvokeMember("OpenDatabase","InvokeMethod",$Null,$WindowsInstaller,@($FilePath.FullName,0))

        Foreach ($Property in $PropertyList)
        {
            $Query = "SELECT Value FROM Property WHERE Property = '$Property'"
            $View = $MSIDatabase.GetType().InvokeMember("OpenView","InvokeMethod",$null,$MSIDatabase,($Query))
            $View.GetType().InvokeMember("Execute", "InvokeMethod", $null, $View, $null)
            $Record = $View.GetType().InvokeMember("Fetch","InvokeMethod",$null,$View,$null)
            $Value = $Record.GetType().InvokeMember("StringData","GetProperty",$null,$Record,1)
            $ReturnObject | Add-Member -MemberType NoteProperty -Name "$Property" -Value $Value
        }
    }

    Catch
    {
        Write-Output $_.Exception.Message
    }

    return $ReturnObject

}

$var2 = test2
$var2.ProductCode


In der Variable

$var2

steht bei mir folgender Inhalt

PS C:\Windows\system32> $var2 | get-member


   TypeName: System.Management.Automation.PSCustomObject

Name           MemberType   Definition
----           ----------   ----------
Equals         Method       bool Equals(System.Object obj)
GetHashCode    Method       int GetHashCode()
GetType        Method       type GetType()
ToString       Method       string ToString()
ProductCode    NoteProperty System.String ProductCode={C43920E3-2939-455A-B1E2-8A0673A5FFCA}
ProductName    NoteProperty System.String ProductName=Cisco AnyConnect Start Before Login Module
ProductVersion NoteProperty System.String ProductVersion=4.2.04018 

trotzdem bekomme ich bei

$var2.ProductCode

keine Ausgabe.

PowerShell Version:

Name                           Value
----                           -----
CLRVersion                     2.0.50727.5485
BuildVersion                   6.1.7601.17514
PSVersion                      2.0
WSManStackVersion              2.0
PSCompatibleVersions           {1.0, 2.0}
SerializationVersion           1.1.0.1
PSRemotingProtocolVersion      2.1                         
Kann mir hier irgendwer Helfen oder einen Tipp geben?

Wie kann ich VMware PowerPCI in Powershell einbinden?

$
0
0

Hi,

Ich wollte fragen ob mir jemand sagen kann wie ich die Cmdlets (z.B. Connect-VIServer, New-vm), welche ich durch die Installation von VMware vSphere PowerPCI5.5 erhalte, in Powershell so einbinde, damit ich diese beispielsweise in der Powergui verwenden kann bzw. das diese erkannt werden.

Ich habe es mit folgendem Code versucht:

Add-PsSnapin VMware.VimAutomation.Core  -ErrorAction SilentlyContinue

Danach erhalte ich folgende Fehlermeldung:

The specified module 'VMware.VimAutomation.Cis.Core' was not loaded because no valid module file was found in any module directory.

Danke für jede Hilfe!

Grüße

advanced function (script cmdlets) robuste Parameterbehandlung/verarbeitung von pipeline-unterstützenden Parametern

$
0
0

Hallo zusammen,

gibt es ein Best Practice, wie die Parameterbehandlung in einer advanced function mit process block erfolgen soll, so dass der pipeline-unterstützende Parameter unabhängig von der Inputvariante (direct vs. pipeline) gleich behandelt/verarbeitet wird?

Die übliche Variante der Aufnahme von "foreach ($inp in $inputObject) { Do something with $_ } " erzeugt unterschiedliches Verhalten, wenn z.B. ein Array von Arrays als direct bzw. pipeline Input übergeben wird. Dazu folgendes Beispiel:

Set-StrictMode -Version Latest

$inp_array = @(("1","2"),("3","4"))
Test-InputHandling $inp_array # direct call
$inp_array | Test-InputHandling # pipeline call

function Test-InputHandling
{
  [CmdletBinding()]
  param(
    [Parameter(ValueFromPipeline=$TRUE)]
    [string[]] $inputObject = "default"
    )

    begin
    {
        $callLine = (Get-PSCallStack)[0].InvocationInfo.Line
        write-output "--- Function call: $callLine ---"
        $n = 0 # counter for objects passed to process block
    }

    process
    {
        write-output "in process block..."
        $inputObject | ForEach-Object { $_ }
        $n++
    }

    end
    {
        Write-Host "-> Input received as $n item(s)"
    }

}

Das Ergebnis unterscheidet sich je nach Aufrufvariante direct vs. pipeline.

Vielen Dank schon mal vorab

Switch / TimeSpan

$
0
0

Guten Abend

Ich habe die folgenden Zeilen:

	# Switch					28 {$Usonne = "05:00, 20:21, 15:21"}
						29 {$Usonne = "05:01, 20:20, 15:18"}
						30 {$Usonne = "05:03, 20:18, 15:15"}
						31 {$Usonne = "05:04, 20:17, 15:12"}

# 29 Juli [20:20]
$Usonne.Split(",")[1].trim()
# 30 Juli [05:03]
$Usonne.Split(",")[0].trim()

Frage: Wie lange ist die Zeitdauer?

# TimeSpan, als normale Benützung. Ok.
$TimeSpan =  [timespan]::fromseconds((New-TimeSpan -Start $Usonne.Split(",")[1].trim() -End $Usonne.Split(",")[0].trim()).TotalSeconds)
$Time = $TimeSpan.ToString("hh\:mm")
$global:Time
# 15:19

Aber ich brauche den Zeitunterschied von 2 Tagen.
Split 1 - Split 0 vom nächsten Tag...

Danke für Ihre Hilfe im voraus,
Arnold



Get-PhysicalDisk

$
0
0

Hallo, ich möchte gerne auf Windows 7 PCs den Status der phy. Festplatten abfragen. Dafür habe ich den Befehl Get-PhysicalDisk gefunden. Nur leider funktioniert dieser Befehl nicht. Gibt es ein cmtlet welches ich laden kann? Wo kann ich dieses finden?

Vielen Dank für eure Hilfe

Norbert



IT Berater

Wie kann ich auf einen SecureString auf einem Laufwerk von mehreren Rechnern zugreifen?

$
0
0

Moin,

in meinem Skript kann sich der Benutzer ein Passwort aussuchen, welches dann mittels SecureString in ein Textdokument gespeichert, welches auf dem privaten Laufwerk des jeweiligen Benutzers liegt.

Das einloggen mit dem erstellten Passwort funktioniert einwandfrei. Allerdings wenn der Benutzer von einem anderen PC sein Passwort eingibt, funktioniert es nicht obwohl das private Laufwerk mit dem Verschlüsseltem Passwort vorhanden ist.

Kann man das irgendwie beheben?

$SetPassword = $NewPassword | ConvertTo-SecureString -AsPlainText
ConvertFrom-SecureString $SetPassword | Out-File H:\Data.log

hier mein Code zum erstellen des Passwortes. Das Passwort steht in Klarschrift in der Variable $NewPassword und H:\ ist das private Laufwerk des Nutzers

Danke für jede Hilfe

Grüße

Installierte Software auslesen (Zeitspanne funktioniert nicht)

$
0
0

Hallo.

Ich habe folgendes Script. Dabei möchte ich sämtliche installierten Software eines Clients auslesen, zB der letzten 3 Monate.

Genau genommen, was wurde in den letzten 3 Monate installiert.


Wenn ich das Script wie unten laufen lasse, werden mir nur Windows Hotfixes angezeigt.

$items = import-csv F:\file.txt -Header servers
	foreach ($item in $items)
		{
		$server = $($item.servers)
		$hosts = resolve-dnsname $Server -ErrorAction SilentlyContinue | Select-Object -expand name
		invoke-command $hosts {
			$using:hosts
			$datepast = (Get-Date).AddMonths(-3)
			$datepast2 = (Get-Date).AddMonths(-3).ToString('yyyyddMM')
			$datenow = Get-Date
			$datenow2 = (Get-Date).ToString('yyyyddMM')
			Get-ItemProperty HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* |Where-Object {$_.installdate -gt "$datepast2" -AND $_.installdate -lt "$datenow2"} |
					select-object DisplayName,Publisher,DisplayVersion,InstallDate | ft -autosize

			Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*  |
				Where-Object {$_.installdate -gt "$datepast2" -AND $_.installdate -lt "$datenow2"} |
					select DisplayName,Publisher,DisplayVersion,InstallDate| ft -autosize

			Get-WmiObject -class Win32_QuickFixEngineering |
                		Where-Object {$_.installedon -gt $datepast -AND $_.installedon -lt $datenow} |
				    select-object Description,HotFixID,InstalledOn | ft -autosize
							} >> "F:\((get-date).tostring("ddMMyyyy")).txt"
		}

Lasse ich jeweils den Teil mit

-AND $_.installdate -lt"$datenow2" ...

weg, bekomme ich zwar die letzten 3 Monate, plus alles aus dem aktuellen Jahr.

Sieht dann wie folgt aus:

$items = import-csv F:\file.txt -Header servers
	foreach ($item in $items)
		{
		$server = $($item.servers)
		$hosts = resolve-dnsname $Server -ErrorAction SilentlyContinue | Select-Object -expand name
		invoke-command $hosts {
			$using:hosts
			$datepast = (Get-Date).AddMonths(-3)
			$datepast2 = (Get-Date).AddMonths(-3).ToString('yyyyddMM')
			$datenow = Get-Date
			$datenow2 = (Get-Date).ToString('yyyyddMM')
			Get-ItemProperty HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* |Where-Object {$_.installdate -gt "$datepast2"} |
					select-object DisplayName,Publisher,DisplayVersion,InstallDate | ft -autosize

			Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*  |
				Where-Object {$_.installdate -gt "$datepast2"} |
					select DisplayName,Publisher,DisplayVersion,InstallDate| ft -autosize

			Get-WmiObject -class Win32_QuickFixEngineering |
               			Where-Object {$_.installedon -gt $datepast} |
				    select-object Description,HotFixID,InstalledOn | ft -autosize
							} >> "F:\((get-date).tostring("ddMMyyyy")).txt"
		}

Jemand eine Idee warum die Angabe der Zeitspanne -gt -AND -lt keine korrekten Werte liefert?


Powershell Script Excel 4 in 1

$
0
0

Hello,

I hope this to me here somebody can help. First excause for mine in English.

I have started to build script for powershell and do not get on. I have 4 Exceltable in 1 Exceldatei should be opened so that I below 4 table sides have to open instead of everybody individually.

$Excel = New-Object -Comobject Excel.Application
$Excel.Visible = $true

$Filepath = "D:\Data\bs000dp7u\Desktop\Excel\S6.csv"
$Workbook = $Excel.Workbooks.Open($Filepath)

$Filepath = "D:\Data\bs000dp7u\Desktop\Excel\S9.csv"
$Workbook = $Excel.Workbooks.Open($Filepath)

$Filepath = "D:\Data\bs000dp7u\Desktop\Excel\s11.csv"
$Workbook = $Excel.Workbooks.Open($Filepath)

$Filepath = "D:\Data\bs000dp7u\Desktop\Excel\S12.csv"
$Workbook = $Excel.Workbooks.Open($Filepath)

If one can also split fade out like z.b. column C,D,G and M.

with friendly ones greet

Problem mit -eq vergleich mit importierter textdatei

$
0
0

Hallo :=)

Ich habe ein Problem mit einen Teil meines scripts.

Und zwar lese ich eine Textdatei ein und speichere diese auf eine Variable / Array.

Die Textdatei enthält Attributwerte welche sich mit dem AD decken  --> "UserPrincipalName"

Ich möchte jetzt eine forschleife laufen lassen, die Benutzer danach Filtern ob sie mit dem UserPrincipalName matchen und mir danach die im AD gespeicherte Email zurückgeben lassen.

Hier der Teil des Scripts

import-module activedirectory

$UPNMail = Get-Content .\meineTxtDatei.txt

for ($i=0; $i -lt $UPNMail.length; $i++) {
    get-aduser -Properties mail -SearchBase "kann ich nicht zeigen weil datenschutz(ist aber sicherlich richtig)" -filter {(UserPrincipalName -eq $UPNMail[$i])}    |
    Select mail }

Es gibt definitiv matches --> wenn ich anstatt $UPNMail[$i]  einen wert der in der textdatei ist nehme findet er sofort matches.

Hier die Fehlermeldung:

Get-ADUser : Fehler beim Analysieren der Abfrage: "(UserPrincipalName -eq $UPNMail[$i])" Fehlermeldung: "Operator Not supported: " an folgender Position: "32".
Bei Zeile:2 Zeichen:15
+     get-aduser <<<<  -Properties mail -SearchBase "OU=BenutzerW7,DC=vw,DC=mpg,DC=de" -filter {(UserPrincipalName -eq $UPNMail[$i])}    |
    + CategoryInfo          : ParserError: (:) [Get-ADUser], ADFilterParsingException
    + FullyQualifiedErrorId : Fehler beim Analysieren der Abfrage: "(UserPrincipalName -eq $UPNMail[$i])" Fehlermeldung: "Operator Not supported: " an folgender Position: "32".,Microsoft.ActiveDirectory.Management.Commands.GetADUser
 

Vielen Dank schonmal :O


Drucker fehlen im CIM

$
0
0

Ich arbeite an einem Logonskript, das Drucker auf einem Terminalserver Server 2012 R2 verbindet. Die Userprofile werden umgeleitet -> XenApp 7.6 mit Profilumleitung

Es wird mit einem Logonskript gearbeitet, da ein Regelwerk für Druckerzuweisungen außerhalb der AD verwendet wird.

Die Druckerverbindungen werden mit con2prt hergestellt. (Alternativ mit Add-Printer oder "Invoke-WmiMethod -Path Win32_Printer -Name AddPrinterConnection", gleiches Ergebnis..)

Manchmal, ich vermute besonders bei sehr vielen Druckerverbindungen, kommt es zu dem Fall, dass das CIM mir nicht mehr die Druckerverbindungen anzeigt.

Normalerweise erhält man ja mit "Get-Printer" oder auch mit "Get-CimInstance -Class Win32_Printer" alle Drucker inkl. der Druckerverbindungen des Clients.

Diese tauchen aber in diesem Zustand nur noch in der Systemsteuerung und in der Registry auf unter

HKCU:\Software\Microsoft\Windows NT\CurrentVersion\PrinterPorts

Das erneute Hinzufügen des Druckers über Powershell bringt nichts, außer der Drucker wurde in der Systemsteuerung gelöscht (Rechtsklick, "Gerät entfernen")

Nun ist das blöd, weil ich in meinem Logonskript auch den Standarddrucker setzen möchte. Dafür verwende ich die passende CIM-Methode und gebe ihr ein CIM-Objekt mit, das ich ja nun eventuell nicht mehr finde..

Invoke-CimMethod -InputObject $ChoosenConnectedPrinter -MethodName SetDefaultPrinter -ErrorAction Stop

Was könnte die Ursache sein, dass die Drucker asynchron sind?

Wie könnte man das CIM Modell wieder synchronisieren? Bis jetzt hilft nur ein Profilreset.

Wie könnte man die Löschung der asynchronen Druckerwarteschlagen trotz der fehlenden CIM-Objekte umsetzen? Sprich: Gibt es eine Möglichkeit, genau das was "Gerät entfernen anklicken" tut programmatisch zu machen?


Variable an Cursorposition schreiben

$
0
0

Hallo Scripter,

wie kann man den Inhalt einer Variable an die aktuelle Cursorpossition schreiben?

Habe ein Script geschrieben und dazu eine Desktopverknüpfung erstellt. In der Verknüpfung eine Funktionstaste zugewiesen und das Script wird minimiert ausgeführt.

Das Script startet ein Eingabefenster in das man einen Wert schreibt und daraus werden infos gezogen und in Variablen gaschrieben. So weit so gut.

Jetzt möchte ich noch ein Script schreiben das den Inhalt der Variablen an die Cursorpossition schreibt. Das Script wird auch per Funktionstaste gestartet und soll nur den Inhalt der Variable an die Cursorpossition übergeben.

Ist das möglich?


Server2012 Feld „OtherPager“ per Script ändern

$
0
0

Hallo,

wie kann ich auf der AD das Feld „Otherpager“ per Script ändern? Über DSQuery/DSMode habe ich keine Möglichkeit gefunden und unter Powershell kann ich die Daten nur aufrufen mit:

Get-ADUser -Identity VFamName -Properties * | fl otherpager

Jedoch wie kann ich diesen Wert ändern?

Hat vielleicht jemand den Masterbefehl für mich (Set-ADUser……..) ?

Danke

SharePoint Einladungen CSOM in Gruppe

$
0
0

Hallo Zusammen,

ich habe das untenstehende Skript. Es ermöglicht es via SharePoint Online Einladungen an externe User zu verschicken.

Auf der Weboberfläche ist es möglich, diese externen User direkt einer Berechtigungsgruppe zuzuordnen. Mit dem Skript sind aber nur rudimentäre Berechtigungen (View, Edit, Owner) möglich. Weiss jemand, wie man diese direkt den Berechtigungsgruppe zuweist?

Falls schon jemand fragen möchte: Nein, es ist nicht möglich den Benutzer am Ende einfach mit Add-SPOUser der Gruppe zuzuordnen, da es sich erstmal nur um eine Einladung handelt, und noch nicht um einen registrieren Benutzer.

Function Add-SharePointSiteExternalUser {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true)]
        [ValidateScript({[system.uri]::IsWellFormedUriString($_,[System.UriKind]::Absolute)})]
        [string]$SiteURL,
        [Parameter(Mandatory=$true)]
        [ValidateNotNull()]
        [System.Management.Automation.PSCredential]$Credential,
        [Parameter(Mandatory=$true,ValueFromPipeline=$True)]
        [net.mail.mailaddress[]]$User,
        [Parameter(Mandatory=$true)]
        [ValidateSet("None","View","Edit","Owner")]
        [string]$Permission,
        [Parameter(Mandatory=$false)]
        [string]$Message = $null,
        [Parameter(Mandatory=$false)]
        [switch]$SendNotificationEmail = $true

    )
    begin{
        $StatusOK = $True
        Write-Verbose "Initializing SharePoint Client Libraries"
        try{
            $loadInfo1 = [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client")
            $loadInfo2 = [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime")
        }
        catch{
            Write-Error "Failed to load SharePoint Client Libraries."
            $StatusOK = $False
            break
        }
        Write-Verbose "Initializing SharePoint context object."
        try{
            $ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
            $SharePointCreds = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Credential.UserName, $Credential.Password)
            $ctx.Credentials = $SharePointCreds
            $SharingManager = [Microsoft.SharePoint.Client.Sharing.WebSharingManager]
        }
        catch{
            Write-Error "Failed to initialize SharePoint context object. Ensure you have the correct permissions on the sharepoint site."
            $StatusOK = $False
            break
        }
        switch ($Permission){"View" {$SetPermission = [Microsoft.SharePoint.Client.Sharing.Role]::View}"Edit" {$SetPermission = [Microsoft.SharePoint.Client.Sharing.Role]::Edit}"Owner"{$SetPermission = [Microsoft.SharePoint.Client.Sharing.Role]::Owner}
        }
    }
    process{
        if(!$StatusOK){return}
        $User | ForEach-Object {
            $CurUser = $_.Address.ToString()
            Write-Host "Granting '$CurUser' '$Permission' access to '$SiteURL'."
            $userList = New-Object "System.Collections.Generic.List``1[Microsoft.SharePoint.Client.Sharing.UserRoleAssignment]"
            $userRoleAssignment = New-Object Microsoft.SharePoint.Client.Sharing.UserRoleAssignment
            $userRoleAssignment.UserId = $CurUser
            $userRoleAssignment.Role = $SetPermission

            $userList.Add($userRoleAssignment)
            try{
                $res = $SharingManager::UpdateWebSharingInformation($ctx, $ctx.Web, $userList, $SendNotificationEmail, $message, $true, $true)
                $ctx.ExecuteQuery()
                $Success = $res.Status
                $StatusMessage = $res.message
                $InvitationLink = $res.InvitationLink
            }
            catch{
                write-error "Error granting '$CurUser' '$Permission' access to '$SiteURL'."
                $Success = $False
                $StatusMessage = "Error granting '$CurUser' '$Permission' access to '$SiteURL'."
            }
            $ObjProperties = @{
                SiteURL = $SiteURL
                Permission = $Permission
                User = $CurUser
                Success = $Success
                StatusMessage = $StatusMessage
            }
            $OutObj = new-object psobject -Property $ObjProperties
            Write-Output $OutObj

        }
    }
}

$Users = "test@contoso.com"
$Message = "Hallo! Dies ist meine Einladung"
$SPSite = "https://tenant.sharepoint.com"
Add-SharePointSiteExternalUser -SiteURL $SPSite -Credential $Credential -User $Users -Permission View -Message $Message -SendNotificationEmail:$true


Ojekte einer Variablen auslesen

$
0
0

Hallo zusammen,

ich habe ein Problem in einem meiner Powershell-Scripte.

Ich lese eine json-Seite über:

$result = (Invoke-WebRequest "$URI" –method GET -ContentType 'application/json; charset=utf8' -Credential $credential)
$Object = ConvertFrom-Json -InputObject $result.Content


aus. Anschließend möchte ich verschiedene Werte auslesen, die ich zum Beispiel über

$Object.value.HeapMemoryUsage.used

abfragen kann. Jetzt soll aber nicht immer das selbe abgefragt werden, was abgefragt werden soll, wird vorher in einer .ini festgehalten und kann damit ständig variieren.

Ich habe schon diverse Ideen ausprobiert, bekomme es aber nicht hin, dass

$Object.value.HeapMemoryUsage.used

ausgeführt wird, wenn ich es aus Teilen der .ini zusammensetze. Ich habe versucht $Object.... komplett in die .ini zu schreiben, mit dem Ergebnis, dass mir das Ganze einfach als Text ausgegeben wird. Dann habe ich versucht die Abfrage zusammen zubauen, sprich $Object fest in den Code zu übernehmen und nur .value.HeapMemoryUsage.used aus der ini zu übernehmen, aber hier habe ich dann nur den Inhalt von $Object angezeigt bekommen und den Rest als Text angehangen. Wie kann ich mit diese Abfrage aus den Variablen zusammensetzen?

Gruß

Marco

Frage zum Script...Datenbanken auslesen

$
0
0

Nachdem ich nun mehrere Stunden den Fehler gesucht habe, versuche ich es nun auf diesem Wege....warum wird mir in der .txt kein Speicherplatz angezeigt?

param(
	[Parameter(ParameterSetName='database')] [string]$database,
	[Parameter(ParameterSetName='file')] [string]$file,
	[Parameter(ParameterSetName='server')] [string]$server,
	[Parameter(ParameterSetName='mailbox')] [string]$mailbox,
	[Parameter(ParameterSetName='all')] [switch]$all,
	[string]$filename
)

#...................................
# Variables
#...................................

$ErrorActionPreference = "SilentlyContinue"
$WarningPreference = "SilentlyContinue"
$report = @()


#...................................
# Initialize
#...................................

#Set recipient scope
$2007snapin = Get-PSSnapin -Name Microsoft.Exchange.Management.PowerShell.Admin
if ($2007snapin)
{
	$AdminSessionADSettings.ViewEntireForest = 1
}
else
{
	$2010snapin = Get-PSSnapin -Name Microsoft.Exchange.Management.PowerShell.E2010
	if ($2010snapin)
	{
		Set-ADServerSettings -ViewEntireForest $true

	}
}

#...................................
# Script
#...................................

#Add dependencies
Import-Module ActiveDirectory

#Get the mailbox list

		Set-ADServerSettings -PreferredServer server.xy.dns
		Set-ADServerSettings -RecipientViewRoot xy.dns

Write-Host -ForegroundColor White "Collecting mailbox list"

if($all) { $mailboxes = @(Get-Mailbox -resultsize unlimited -IgnoreDefaultScope) }

if($server) { $mailboxes = @(Get-Mailbox -server $server -resultsize unlimited -IgnoreDefaultScope) }

if($database){ $mailboxes = @(Get-Mailbox -database $database -resultsize unlimited -IgnoreDefaultScope) }

if($file) {	$mailboxes = @(Get-Content $file | Get-Mailbox -resultsize unlimited) }

if($mailbox) { $mailboxes = @(Get-Mailbox $mailbox) }

#Get the report

Write-Host -ForegroundColor White "Collecting report data"

$mailboxcount = $mailboxes.count
$i = 0

$mailboxdatabases = @(Get-MailboxDatabase)

#Loop through mailbox list and collect the mailbox statistics
foreach ($mb in $mailboxes)
{
	$i = $i + 1
	$pct = $i/$mailboxcount * 100
	Write-Progress -Activity "Collecting mailbox details" -Status "Processing mailbox $i of $mailboxcount - $mb" -PercentComplete $pct

	$stats = $mb | Get-MailboxStatistics | Select-Object TotalItemSize,TotalDeletedItemSize,ItemCount,LastLogonTime,LastLoggedOnUserAccount

    if ($mb.ArchiveDatabase)
    {
        $archivestats = $mb | Get-MailboxStatistics -Archive | Select-Object TotalItemSize,TotalDeletedItemSize,ItemCount
    }
    else
    {
        $archivestats = "n/a"
    }

    $inboxstats = Get-MailboxFolderStatistics $mb -FolderScope Inbox | Where {$_.FolderPath -eq "/Inbox"}
    $sentitemsstats = Get-MailboxFolderStatistics $mb -FolderScope SentItems | Where {$_.FolderPath -eq "/Sent Items"}
    $deleteditemsstats = Get-MailboxFolderStatistics $mb -FolderScope DeletedItems | Where {$_.FolderPath -eq "/Deleted Items"}
    #FolderandSubFolderSize.ToMB()

	$lastlogon = $stats.LastLogonTime

	$user = Get-User $mb
	$aduser = Get-ADUser $mb.samaccountname -Properties Enabled,AccountExpirationDate

	#Create a custom PS object to aggregate the data we're interested in

	$userObj = New-Object PSObject
	$userObj | Add-Member NoteProperty -Name "Company" -Value $user.Company
    $userObj | Add-Member NoteProperty -Name "Office" -Value $user.Office
	$userObj | Add-Member NoteProperty -Name "DisplayName" -Value $mb.DisplayName
    $userObj | Add-Member NoteProperty -Name "Total Mailbox Size (MB)" -Value ($stats.TotalItemSize.Value.ToMB() + $stats.TotalDeletedItemSize.Value.ToMB())
    #$userObj | Add-Member NoteProperty -Name "Total Mailbox Size (GB)" -Value ($stats.TotalItemSize.Value.ToGB() + $stats.TotalDeletedItemSize.Value.ToGB())

	#Add the object to the report
	$report = $report += $userObj
}

#Catch zero item results
$reportcount = $report.count
$billdate = Get-Date -UFormat %Y%m%d

if ($reportcount -eq 0)
{
	Write-Host -ForegroundColor Yellow "No mailboxes were found matching that criteria."
}
else
{
	#Output single mailbox report to console, otherwise output to CSV file
	if ($mailbox)
	{
		$report | Format-List
	}
	else
	{
		$report | Out-File -Encoding utf8 Z:\$billdate\Exchange\$filename.txt
		#$report | Out-File -Encoding utf8 C:\Users\dmontag\Desktop\$filename.txt
		Write-Host -ForegroundColor White "Report written to $filename .txt in current path."
		Get-Item $filename
	}
}


#####################################################################################################################################################

Set-ExecutionPolicy Unrestricted

$billdate = Get-Date -UFormat %Y%m%d
$path="Z:\$billdate\Exchange\Exchange.xlsx"

Z:\Scripte\Exchange\exchange.ps1

#Instanzieren eines COM-Objektes für Excel
$excel = new-object -comobject excel.application
$excel.visible = $False
$excel.DisplayAlerts = $False

#Arbeitsmappe laden
$workbook = $excel.Workbooks.Add()

foreach ($companys in (Get-Content Z:\Scripte\Exchange\companys.txt))
{
    # Ignore blank lines
    if ($companys) {
		$worksheet = $excel.Worksheets.Add()
		$companys = $companys.Trim()
        $workbook.Worksheets.Item(1).Name = "$companys"
		$workbook.Worksheets.Item(1).Cells.Item(1,1) = "Company"
		$workbook.Worksheets.Item(1).Cells.Item(1,2) = "Office"
		$workbook.Worksheets.Item(1).Cells.Item(1,3) = "Username"
		$workbook.Worksheets.Item(1).Cells.Item(1,4) = "Size in MB"
		$workbook.Worksheets.Item(1).Cells.Item(1,5) = "Price in Euro"
    }
}

$Firma1 = Get-Content Z:\$billdate\Exchange\"Firma1.txt"
$Firma1 -replace 'Firma1', 'F1    ' > Z:\$billdate\Exchange\"Firma1.txt"

$Firma2 = Get-Content Z:\$billdate\Exchange\"Firma2.txt"
$Firma2 -replace 'irma2', '     ' -replace 'Firma2', 'F2     ' > Z:\$billdate\Exchange\"Firma2.txt"

$postfaecher = 0

echo "Excel Tabelle wird gebaut"

foreach ($companylist in (Get-Content Z:\Scripte\Exchange\companylist.txt))
{
	foreach ($postfaecher in (Get-Content Z:\$billdate\Exchange\$companylist.txt | Where-Object { $_.readcount -gt 4}))
	{
		# Ignore blank lines
		if ($postfaecher) {
			$company,$office,$user,$size = $postfaecher -split ' {2,}'
			if ([string]::IsNullOrEmpty($company) -or [string]::IsNullOrEmpty($office))
			{
				$worksheet = $workbook.worksheets | where {$_.name -eq "Tester"}
				$postfaecherCount++
				$count = ($worksheet.UsedRange.Rows).count+1
				$worksheet.Cells.Item($count,1) = "$company"
				$worksheet.Cells.Item($count,2) = "$office"
				$worksheet.Cells.Item($count,3) = "$user"
				$worksheet.Cells.Item($count,4) = "$size"

$worksheet.Cells.Item($count,5) = "$price"

foreach ($companys in (Get-Content Z:\Scripte\Exchange\companys.txt))
{
	$worksheet = $workbook.worksheets | where {$_.name -eq "$companys"}
	$row = $worksheet.UsedRange.rows.count
	$range = $worksheet.Range("B2:AK$row")
	$range2 = $worksheet.Range("B2")
	$range.Sort($range2)
	#Autofit the columns
}

$workbook.SaveAs($path)
$workbook.Close()

#COM-Objektes beenden
$Excel.Quit()
#COM-Objektes aus dem Speicher entfernen
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)

Registry durchsuchen und Werte ändern?

$
0
0

Hallo liebes Forum,

ich stehe derzeit vor folgendem Problem.

Aus Datenschutztechnischen Gründen, müssen in unserer Firma die sAMAccountName/Benutzernamen geändert werden.

Im Active Directory lassen sich ja die Änderungen leicht durchführen, jedoch kommen wir an einer Stelle nicht weiter.

Lokal am Client werden die Accounts ja über die SID verknüpft, um hier ein neues Profil sauber (?) anzulegen, löschen wir in der Registry über die SID das alte Profil (HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfilList).

Bis hierhin ist auch noch alles OK.

Mein Problem beginnt nun damit, dass die Benutzer teilweise Dokumente nicht mehr öffnen können oder vorgenommene Einstellungen nicht über einen Neustart hinaus gespeichert werden.

In der Registry konnte ich noch sehr viele alte Daten mit dem alten Benutzernamen finden welche auf Dateien und config files verweisen.

Ändere ich nun die Benutzernamen manuell indem ich die Registry durchsuche und überall den neuen Namen eintrage, so können die Benutzer wieder auf alle Dateien zugreifen und auch die Änderungen werden sauber übernommen.

Da ich nun nicht bei 700 Benutzern Lust habe die Registry jeweils an knapp 90 Stellen zu editieren dachte ich mir dass sich das ganze über die PowerShell lösen lässt.

Wie schaffe ich es jedoch die komplette HKEY_USERS nach einem String stück (z.B. „AlterBenutzername“) im Datenfeld zu suchen und diesen Wert zu aktualisieren.

z.B.:

HKEY_USERS:\*Variable*\*Variable*\*Variable*

                Name: *Variable*

                Daten:\\Servername\*AlterBenutzername*\Daten

Oder

HKEY_USERS:\*Variable*\*Variable*\*Variable*

                Name: *Variable*

Daten: /C/users/*AlterBenutzername*/*irgendwelcheDaten*

Soll dann zu

HKEY_USERS:\*Variable*\*Variable*\*Variable*

                Name: *Variable*

                Daten:\\Servername\*NeuerBenutzername*\Daten

Oder

HKEY_USERS:\*Variable*\*Variable*\*Variable*

                Name: *Variable*

Daten: /C/users/*NeuerBenutzername*/*irgendwelcheDaten*

Werden.

Geht das überhaupt, gibt es einen besseren Weg ohne dass die Benutzer am besten etwas von der Änderung mitbekommen und all ihre Einstellungen und Daten wie vor der Änderung behalten?

Wäre  für jede Hilfe dankbar.

Gruß

D.Z.C

Viewing all 2314 articles
Browse latest View live