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

NTFS Berechtigungen korrigieren

$
0
0

Hallo,

ich folgendes Problem welches ich nicht aufgelöst bekomme:

Viele Ordner auf einem FileServer unter Windows Server 2012 enthalten doppelte NTFS Berechtigungen, in der Powershell sieht das so aus:

$a = get-acl .\Ordner
$a.access

FileSystemRights  : Modify, Synchronize
AccessControlType : Allow
IdentityReference : Domain\Gruppe
IsInherited       : False
InheritanceFlags  : ContainerInherit, ObjectInherit
PropagationFlags  : None

FileSystemRights  : Modify, Synchronize
AccessControlType : Allow
IdentityReference : Domain\Gruppe
IsInherited       : False
InheritanceFlags  : ContainerInherit, ObjectInherit
PropagationFlags  : None

FileSystemRights  : Modify, Synchronize
AccessControlType : Allow
IdentityReference : Domain\Benutzer
IsInherited       : False
InheritanceFlags  : ContainerInherit, ObjectInherit
PropagationFlags  : None

Wie man sieht taucht die Gruppe 2 mal mit den identischen Berechtigungen auf. ich habe nun angefangen ein Script zu erstellen, welches aber nicht funktionieren will und ich erkenne den/die Fehler nicht:

Ausnahme beim Aufrufen von "RemoveAccessRule" mit 1 Argument(en):  "Der Wert darf nicht NULL sein.
Parametername: rule"
In D:\correct_doublepermissions.ps1:43 Zeichen:2+  $fileacl.RemoveAccessRule($saveacl)+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ CategoryInfo          : NotSpecified: (:) [], MethodInvocationException+ FullyQualifiedErrorId : ArgumentNullException

Ausnahme beim Aufrufen von "AddAccessRule" mit 1 Argument(en):  "Der Wert darf nicht NULL sein.
Parametername: rule"
In D:\correct_doublepermissions.ps1:44 Zeichen:2+  $fileacl.AddAccessRule($saveacl)+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ CategoryInfo          : NotSpecified: (:) [], MethodInvocationException+ FullyQualifiedErrorId : ArgumentNullException

Das Argument "identity" mit dem Wert  "VORDEFINIERT\Administratoren" für "SetOwner" kann nicht in den Typ"System.Security.Principal.IdentityReference" konvertiert werden: "Der Wert "VORDEFINIERT\Administratoren" vom Typ"System.String" kann nicht in den Typ "System.Security.Principal.IdentityReference" konvertiert werden."
In D:\correct_doublepermissions.ps1:49 Zeichen:2+  $fileacl.SetOwner($fileowner)+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ CategoryInfo          : NotSpecified: (:) [], MethodException+ FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument

Kann mir jemand auf die Sprünge helfen?

Das Script sieht so aus:

$tmpowner = New-Object System.Security.Principal.NTAccount('VORDEFINIERT\Administratoren')

$files = Get-ChildItem -Recurse | where {$_.PSIsContainer -eq "True"} | foreach -Process {$_.Fullname}
foreach ($file in $files)
{

 #Neue ACL einlesen und nach doppelten Gruppen suchen
 
 $fileacl = get-acl $file
 $fileaccessgroups = $fileacl.access.IdentityReference
 $diff = $fileaccessgroups | select -Unique
 $doubleentries = compare-object -ReferenceObject $fileaccessgroups -DifferenceObject $diff
 if ($doubleentries)
 {
 
 foreach ($doubleentry in $doubleentries)
 {
 $doubleentry = $doubleentry.InputObject
 $doubleentry = $doubleentry.Value
 $doubleentry = $doubleentry.Replace("\","\\")

 #Doppelte Eintraege in ACL entfernen
 
 $saveacl = $fileacl.access | where {$_.IdentityReference -match "$doubleentry" -and $_.IsInherited -match "False"} | select -last 1
 if ($saveacl)
 {
   Temp Owner setzen damit Powershell die ACL aendern kann
 $fileacl = get-acl $file
 $fileowner = $fileacl.Owner
 #fileacl.SetOwner($tmpowner)
 #Set-Acl -AclObject $fileacl -Path $file
 $null =  $fileacl.RemoveAccessRule($saveacl)
 $fileacl.AddAccessRule($saveacl)
 Set-Acl -AclObject $fileacl -Path $file
 #Urspruenglichen Owner wieder setzen
 $fileacl = get-acl $file
 $fileacl.SetOwner($fileowner)
 Set-Acl -AclObject $fileacl -Path $file
 } 
 }
 }
}

Vielen Dank im Voraus und ein schönes Wochenende

Frank


Aufruf von Disk2VHD mit Prüfung des Rückgabewertes

$
0
0

Hallo,

ich möchte mir über ein Script automatisiert auf einem Server 2008 R2 eine VHD aller Laufwerke mit dem Sysinternals Tool "disk2vhd.exe" erstellen lassen. Das Script soll erst nach der Erstellung der VHDs fortfahren.
Wichtig ist besonders, dass eine Prüfung stattfindet, ob die VHD(s) mit disk2vhd auch ordnungsgemäß erzeugt wurden. Hierzu soll nach dem Beenden des Aufrufs von disk2vhd geprüft werden, ob das Programm ordnungsgemäß durchgelaufen ist, oder ob es bei der Erstellung irgendeinen Fehler gab (etwa im Schattenkopiedienst oder ähnliches) auftrat. Die Prüfung soll zwingend bei der Erstellung erfolgen - also beim Aufruf bzw. beim Beenden des Aufrufs - und nicht etwa durch nachträgliche Dateigrößenprüfung, Datumsprüfung oder ähnliches!

Bei Batch-Scripts arbeitete man soweit ich weiß noch mit Rückgabewerten oder Errorcodes - dies scheint bei der PowerShell aber etwas anders zu laufen. Leider scheinen $?, $LASTEXITCODE oder $Error den Ergebniscode von disk2vhd nicht aufzunehmen. Bzw. weiß ich nicht, ob ein dort geloggter Fehler von Disk2VHD oder einer Codezeile früher resultiert. Bislang war es mir zumindest nicht möglich herauszufinden, an welcher Stelle so ein Rückgabewert auftaucht bzw. wie ich diesen abgreifen muss und identifizieren kann. Derzeit sieht der relevante Teil des Scripts wie folgt auf:

$Programmpfad = "C:\Disk2vhd\disk2vhd.exe" 
$Sicherungspfad = "\\SERVERNAME\Freigabe$\_VHDs\"
$Computername = "_DUMMY_COMPUTERNAME"
$Computername = Get-Content env:Computername

$VHD_Dateipfad = $Sicherungspfad + $Computername + ".VHD"
$LOG_Dateipfad = $Sicherungspfad + $Computername + ".LOG"


$argumente = "* " + VHD_Dateipfad 
Start-Process $Programmpfad -ErrorAction Continue -ArgumentList $argumente -WindowStyle Hidden -PassThru  | Wait-Process

PS: Eine Try/Catch Behandlung generiert auch keinen Fehler bei der Erstellung der VHD-Datei, solange disk2vhd nicht durch einen Systemfehler beendet wird. Sprich: Es wird nur ein Fehler erkennt, der das Programm betrifft (etwa: disk2vhd-prozess crashed), nicht aber einen Fehler während der VHD-Erstellung (etwa: eine unterbrochene Netzwerkverbindung).

Ich sage schon jetzt danke an alle Helfer! Unnötig zu sagen, dass meine PowerShell Erfahrungen noch recht übersichtlich sind ;-)

VG

DFS Ordner erstellen

$
0
0

Hallo zusammen,

ich will einen neuen DFS Ordner / Baum anlegen.

Soweit so gut, die DFS links mit Target funktionieren auch einwandfrei mit :

dfsutil link add \\system-a.local\DFS\PStestlink3\test\ \\fileserver\share\folder

Aber wie kan ich im DFS mit Powershell einfach nur einen Ordner ohne target erzeugen.

Laut der dfsutil Hilfe mit dem Parameter  restore leider klappt das nicht.

Weiß jemand Rat?

Danke & Grüße

Thomas

Logfile erstellen und per Mail in Powershell versenden

$
0
0

Hallo,

$a=get-content c:\temp\serverliste.txt
foreach($server in $a){
Get-Wmiobject win32_process -computer $server |
    Where-Object {$_.name -like "iexplore.exe" -and $_.ws -gt "100000"} |
        Select-Object  __Server,WS,name,@{n="owner";e={$_.getowner().user}} |
        ForEach-Object { write-host "Warnung! Auf Server: $($_.__Server),Prozess: $($_.name), WS: $($_.WS), User: $($_.owner)"}
}

soweit bin ich! Ich erhalte auch damit das gewünschte Ergebnis.

Jetzt möchte ich das in ein LogFile schreiben und wenn ein Logfile ( nur dann) existiert es per Mail aus dem Script heraus versenden.

Diese Zeile habe ich ersetzt und statt write host habe ich out-file -append eingefügt. Leider hagelt es dann Fehler!

ForEach-Object { write-host "Warnung! Auf Server: $($_.__Server),Prozess: $($_.name), WS: $($_.WS), User: $($_.owner)"}
Fehler lautet:

Es wurde kein Positionsparameter gefunden, der das Argument "Warnung! bla bla bla .... akzeptiert..............

Um anschließend das Log-File zu versenden reicht es da am Ende des Scripts ein if exist logfile.txt then send-mailmessage einzufügen?

Danke für die Hilfe!

Probleme mit Write-Zip

$
0
0

Hallo Zusammen,

leider habe ich noch nicht viel Ahnung von Powershell und taste mich langsam vor...

ich habe folgendes Problem:ich habe alle täglichen Logfiles in ein monatliches Logfile zusammengefasst und möchte dieses monatliche Log in eine Zip-Datei "monatlicheLogs" schieben. Das soll für alle vorhandenen Ordner durchgeführt werden, deswegen die for-Schleife.

Mein momentan "chaotischer" Code:

Set-StrictMode -Version "2.0"
Clear-Host
Import-Module pscx

$Source="D:\bla\bla\bla"
$Destination="D:\bla\bla\bla\bla" #muss existieren
$Level=1

#Alle Verzeichnisse
$Folders=@(Get-ChildItem -Path $Source| Where-Object {$_.name -NotLike "Test1"}| Where-Object {$_.name -NotLike "Test2"} | Where{$_.PSISContainer -Match $true})


Set-Location D:\bla\bla
$jahrmonat = "{0:yyyyMM}" -f (get-date).AddMonths(-1)

#sammelt die tägl. Logs in monatliche nach folgendem Muster: XXX_yyyymm
for ($i=0; $i -le $Folders.Length-1; $i++)
{$Files=@(Get-ChildItem -Path $Folders[$i] | SELECT Name | Format-Table -AutoSize;)
$Path= $Folders[$i]
$Dateiname= $Path.Name + '_' + $jahrmonat + '.log'
Add-Content -Path $Source\$Path\$Dateiname -Value (Get-Content -Path $Source\$Path\u_ex*.log)
$Files| Write-Zip -path $Folders[$i] -level 1  -OutputPath $Destination\$_.zip -quiet | where {$_.name -notLike "u_*"}}

Die letzte Zeile funktioniert überhaupt nicht...bekomme als Fehlermeldung:

Write-Zip : The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.

Wäre über jede Hilfe dankbar! Sitze jetzt schon paar Wochen dran :-/

Vielen Dank!




start-bitstransfer problem

$
0
0

Hallo,

ich habe eine .ps1 Datei in der ich start-bitstransfer nutze um 4 Dateien von einer Website in einen bestimmten Ordner zu laden. Die .ps1 Datei wird von einer start.cmd aufgerufen. Das funktioniert auch alles super.. Jetzt habe ich allerdings den Auftrag bekommen die start.cmd von einer scheduledImport.cmd mit einem anderen user auszuführen..

____________

runas /user:ZB\XXXXXX D:\XXX\scripts\XXX\start.cmd

____________

Dabei bekomme ich folgenden Fehler:

____________

Start-BitsTransfer : The operation being requested was not performed because th
e user has not logged on to the network. The specified service does not exist.
(Exception from HRESULT: 0x800704DD)
At D:\XXX\scripts\XXX\shell.ps1:10 char:30
+     $Job = Start-BitsTransfer <<<<  -Source $source -Destination $destination
 -Asynchronous
    + CategoryInfo          : NotSpecified: (:) [Start-BitsTransfer], COMExcep
   tion
    + FullyQualifiedErrorId : System.Runtime.InteropServices.COMException,Micr
   osoft.BackgroundIntelligentTransfer.Management.NewBitsTransferCommand

____________

Hat jemand eine Idee wie ich diesen Fehler beheben kann?


lg Zuyas

SnapIn hinzufügen

$
0
0

Hallo,

ich möchte gerne über ein PHP Script ein Powershellscript ausführen. Soweit kein Problem.

Nun möchte ich aber einen User im AD über dieses PS-Script anlegen. Damit hat der User - welcher das PHP Script ausführt - keine Rechte zum anlegen des Users.

Wie kann ich im Powershellscript - welches nicht mit Adminrechten ausgeführt wird - SnapIns (für Exchange 2010) und andere Befehle ausführen?

Die Credentials des Admins habe ich in einer Variable gespeichert. Aber wie kann ich z.B. Add-SnapIn damit aufrufen und in der aktuellen Session benutzen?

Invoke-Command ??

Viele Grüße

Uwe

Zugriff auf existierendes COM-Objekt

$
0
0

Moin, moin!

Ich bin Anfänger in der Powershell-Programmierung und versuche, aus einem Powershell-Script  auf eine laufende Microsoft-Access-Anwendung zuzugreifen.
Alle Beispiele, die sich auf das Powershell-comobject beziehen, legen aber mit New einen neuen Prozess an.

Das hier habe ich schon versucht, der Teil unter  "MSACCESS.EXE ist aktiv"  funktioniert aber nicht:

$proc = Get-Process | Where-Object {$_.ProcessName -eq "MSACCESS"}

if ($proc -imatch "MSACCESS")
    {
    Write-Host "MSACCESS.EXE ist aktiv"
    $ShellApp = New-Object -ComObject Shell.Application
    $Fenster = $ShellApp.Windows() | Where-Object { $_.LocationName -eq "Kabelüberwachung" }
    $FensterDOM = $Fenster.Application
    Write-Host "Ende!"  

    }
else
    {
    Write-Host 'MSACCESS.EXE ist nicht aktiv - wird gestartet'
    $start = "`"C:\Program Files\Microsoft Office\Office14\msaccess.exe`" X:\MDB\Entw2010\Kabelueberwachung\Kabelueberwachung.accdb /cmd `"Cmd=K_S|IDX=11`""
    & "C:\Program Files\Microsoft Office\Office14\msaccess.exe" X:\MDB\Entw2010\Kabelueberwachung\Kabelueberwachung.accdb /cmd "Cmd=K_S|IDX=11"
    #$start = "Test"
    Write-Host $start
    #invoke-Command $start
    }
read-host

Vielen Dank schon mal!

    

Powershell Set-Content fails

$
0
0

Hi all, 

I am new to powershell and want to copy logfiles from one directory, change some contents and write back the changed logfile to a destination directory. My script looks like this: It works fine when I don't include the Set-Content statement. The displayed path and filenames are correct.  Executing the  set-content statement leads to an error (see blow), also | out-file $outputfile doesn't work.  Any help or suggestions are welcome. 

function test1 

{
    param
    (
        [Parameter(Mandatory=$true, ValueFromPipeline=$true)]
        [string]
        $InputPath,

        [Parameter(Mandatory=$true, ValueFromPipeline=$true)]
        [string]
        $OutputPath

    )

    process
    {
        $OutputFile = " "

        Get-ChildItem -Path $InputPath\* -Include *.log |  
          ForEach-Object { 
            "processing dir \ file: $_"
            $FileName = $_.name 

            "processing File : $Filename"
            $OutputFile = $OutputPath+"\"+$FileName
            "Output Path & File : $OutputFile"

            Get-Content $_ |
            ForEach-Object {
              $Line = $_ 
              ### more procssing  here 
            } 
          } |  Set-Content -Path $OutputFile
    }  
}

test1 C:\qv\InputLogfiles C:\qv\OutputLogfiles 
Set-Content : Could not find a part of the path 'C:\Users\son\'.
In Zeile:33 Zeichen:16
+           } |  Set-Content -Path $OutputFile
+                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Set-Content], DirectoryNotFoundException
    + FullyQualifiedErrorId : System.IO.DirectoryNotFoundException,Microsoft.PowerShell.Commands.SetContentCommand

 

Siegmund Sonntag

Module/SnapIns beim Systemstart laden

$
0
0

Hallo,

ist es möglich ein Powershell Modul/SnapIn bereits beim Systemstart des Servers zu laden, um die Ladezeiten für Nagios Überwachungsscripte entsprechend zu verkürzen?

Es geht konkret um die Überwachung von Exchange 2010 Servern. Dazu muss am Anfang das SnapIn "Microsoft.Exchange.Management.PowerShell.E2010" geladen werden. Dieser Vorgang dauert extrem lange und verursacht eine hohe Auslastung des Servers.
Das es sich um Überwachungsscripte handelt, werden diese in regelmäßigen Abständen (alle 5-10 Minuten) ausgeführt.
Es wäre schön, wenn man dafür das Modul/SnapIn nur einmal in den Hintergund laden müsste und es dann immer wieder verwendet werden kann.

Gruß

Powershell: Get-QADGroup die Ausgabe DN in eine Variable schreiben und später mit Add-QADGroupMember User zur Grouppe hinzufügen wie!?

$
0
0

Hallo liebe Leute,

Folgender script liegt vor, bisher läuft das ganze so ab:

$impcsvfile | ForEach-Object {

#checking if group allready exists, if not the group is going to be created
Write-Host "Step 3: checking if group allready exists, if not the group is going to be created" -ForegroundColor Green -BackgroundColor DarkGreen

#region checkg

#checking group existens
$checkg = [ADSI]::Exists("LDAP://CN=$($_.GROUPNAME),OU=$($_.OU),OU=Gruppen,OU=Users,OU=KL,OU=D,OU=KL-Group,DC=kl,DC=int")
#or?
#$checkg = [ADSI]::Exists("LDAP://CN=$($_.GROUPNAME),DC=kl,DC=int")
#becouse the group has the be searcht over the whole container not just in the specific OU, becouse that OU was newly created for the script...!?

#endregion

#region if group exists

#if group exists
if ($checkg -eq $false)
    {
	 #creating new group
	 Write-Host "Step 3.1: creating new group" -ForegroundColor Blue -BackgroundColor DarkGreen
     New-QADGroup -Name $_.GROUPNAME -SamAccountName $_.GROUPNAME -DisplayName $_.GROUPNAME -Description $_.GROUPDESCRIPTION -GroupScope Global -GroupType Security -ParentContainer "OU=$($_.OU),OU=Gruppen,OU=Users,OU=KL,OU=D,OU=KL-Group,DC=kl,DC=int" -ErrorAction Continue #| tee -FilePath $tee\$teename
	 #(get-QADGroup 'CN=$($_.GROUPNAME),OU=$($_.OU),OU=Gruppen,OU=Users,OU=KL,OU=D,OU=KL-Group,DC=kl,DC=int').DirectoryEntry.name
    }
else
    {
	 #continueing if group allready exists
     Write-Error -Message "group exists continueing" -ErrorAction SilentlyContinue -ErrorVariable $Error3
	 #(get-QADGroup 'CN=$($_.GROUPNAME),OU=$($_.OU),OU=Gruppen,OU=Users,OU=KL,OU=D,OU=KL-Group,DC=kl,DC=int').DirectoryEntry.name
    }

#show info group
#(get-QADGroup 'CN=$($_.GROUPNAME),OU=$($_.OU),OU=Gruppen,OU=Users,OU=KL,OU=D,OU=KL-Group,DC=kl,DC=int').DirectoryEntry.name | Write-Host

#endregion

#endregion

#----------------------------------------------------------------

#region check if user disbaled + add user

#checking if user is deactivated, if not the user gets a member of the group, if, he is removed
Write-Host "Step 4: checking if user is deactivated, if not the user gets a member of the group, if, he is getting removed" -ForegroundColor Black -BackgroundColor Yellow

#region disable check variables

#variables (with directorysearcher)
$ds = New-Object System.DirectoryServices.DirectorySearcher
$ds.Filter = "(&(objectCategory=Person)(sAMAccountname=$($_.USER))(!userAccountControl:1.2.840.113556.1.4.803:=2))"
$du = $ds.FindOne()
$de = $du.GetDirectoryEntry()

#endregion

#region if user is disabled

#checking if user is deactivated 
if ($du = $ds.FindOne())
   {
    #adding user to the group
    Write-Host "Step 4.1 adding user to group" -ForegroundColor Blue -BackgroundColor Yellow
    Add-Qadgroupmember -Identity "CN=$($_.GROUPNAME),OU=$($_.OU),OU=Gruppen,OU=Users,OU=KL,OU=D,OU=KL-Group,DC=kl,DC=int" -Member $_.USER -ErrorAction Continue #| tee -FilePath $tee\$teename
	#(Get-QADGroupMember 'CN=$($_.GROUPNAME),OU=$($_.OU),OU=Gruppen,OU=Users,OU=KL,OU=D,OU=KL-Group,DC=kl,DC=int').DirectoryEntry.name
   }
else
    {
	 #removing and error if user is deactivated
	 Write-Host "Step 4.?(2) removing user from group" -ForegroundColor Red -BackgroundColor Yellow
	 Remove-QADGroupMember -Identity "CN=$($_.GROUPNAME),OU=$($_.OU),OU=Gruppen,OU=Users,OU=KL,OU=D,OU=KL-Group,DC=kl,DC=int" -Member $_.USER -ErrorAction SilentlyContinue
	 Write-Error -Message "user is disabled, next step" -ErrorAction SilentlyContinue -ErrorVariable $error4
	 #(Get-QADGroupMember 'CN=$($_.GROUPNAME),OU=$($_.OU),OU=Gruppen,OU=Users,OU=KL,OU=D,OU=KL-Group,DC=kl,DC=int').DirectoryEntry.name
    }

#show info group user/s
#(Get-QADGroupMember 'CN=$($_.GROUPNAME),OU=$($_.OU),OU=Gruppen,OU=Users,OU=KL,OU=D,OU=KL-Group,DC=kl,DC=int').DirectoryEntry.name | Write-Host

}

#endregion

#endregion

in Zukunft soll das ganze eher so Aussehen:

try { get-qadgroup "$_.GROUPNAME" }

catch

{

#creating new group
Write-Host "Step 3.1: creating new group" -ForegroundColor Blue -BackgroundColor DarkGreen
New-QADGroup -Name $_.GROUPNAME -SamAccountName $_.GROUPNAME -DisplayName $_.GROUPNAME -Description $_.GROUPDESCRIPTION -GroupScope Global -GroupType Security -ParentContainer "OU=$($_.OU),OU=Gruppen,OU=Users,OU=KL,OU=D,OU=KL-Group,DC=kl,DC=int" -ErrorAction Continue

}

weil ich mit [ADSI] nicht in der gesamten Directory überprüfen kann ob die Gruppe existiert soll das ganze mit Get-QADGroup geprüft werden und der ausgabewert "DN" von:

Name                           Type            DN                                                                                                              
----                           ----            --                                                                                                              
testt                          group           CN=testt,OU=Test-OU-Temp,DC=kl,DC=int

für das hinzufügen von neuen GroupMember benutzt werden also z.B:

Add-Qadgroupmember -Identity "$AUSGABEWERT VON GET_QADGROUP (SPALTE DN)" -Member $_.USER -ErrorAction Continue #

also meine Frage: Wie bekomme ich die Ausagen "DN" in eine Variable die ich später verwenden kann??

danke für jegliche Hilfe


Domenicc TechNet Foren Thanks

Nur aktuelle, tägliche Logs zusammenfassen

$
0
0

Guten Morgen zusammen,

ich habe einen Code, der die täglichen Logdateien in ein monatliches Log zusammenschreibt. Das wird dann wiederum in ein Zip-Archiv geschoben.

Das Problem ist jetzt, dass die alten, täglichen Logs z.B. die vom April im selben SourceOrdner stehen, wie die neuen Logs vom Mai. Deswegen möchte ich, dass die täglichen Logs vom z.B. April gelöscht werden, nachdem das monatliche Log erstellt wurde.  ODER: Eine Abfrage, die die tägl. Logs des aktuellen Monats zusammenfast ind das monatliche. Damit im Ordner immer die aktuellen täglichen Logs zusammengefasst werden.

Noch zur Info: Das Script wirtd 1 Mal im Monat von einem Task ausgeführt.

Set-StrictMode -Version "2.0"
Clear-Host
Import-Module pscx

$Source="D:\bla\bla"
$Destination="D:\bla\bla\bla" #muss existieren
$Level=1
$jahrmonat = "{0:yyyyMM}" -f (get-date).AddMonths(-1)

#Alle Verzeichnisse
$Folders=@(Get-ChildItem -Path $Source -Exclude 'Test' | Where{$_.PSISContainer -Match $true})

#sammelt die tägl. Logs in monatliche nach folgendem Muster: XXX_yyyymm
ForEach ($Folder in $Folders) {
    $Dateiname= $Folder.Name + '_' + $jahrmonat + '.log'
    Add-Content -Path (Join-Path $Folder.Fullname $Dateiname) -Value (Get-Content -Path (Join-Path $Folder.Fullname 'u_ex*.log'))
    #das monatliche LogFile wird in ein gleichnamiges Zip-Archive gepackt 
    ForEach ($File in Get-ChildItem -Path $Folder) {
        if ($File.name -notlike "u_*") {
	       Write-Zip -path $File.Fullname -Level $Level -OutputPath (Join-Path $Destination  ($Folder.Name + '.zip')) -quiet -Append}
    }
}

Freue mich über jede Hilfe!

Vielen Dank!


Get-WmiObject Filter auf eine Eigenschaft die als Array definiert ist moeglich

$
0
0

Hallo,

Mit diesem Befehl kann ich mir ja die definierten Netwerkadapter ansehen

$NWCard = Get-WmiObject win32_networkadapterconfiguration -Computer Name

Weil das gerade bei W7 bzw. W2K8R2 sehr viele sind kann man filtern, zb.: so

$NWCard = Get-WmiObject win32_networkadapterconfiguration -Computer Name -Filter "ipenabled = 'true'"

Nun sehe ich nur noch die Adapter die eine IP haben, dies passt nun auf den meiseten Servern, allerdings nciht bei Clustersysteme, weil es dort ein
Public und ein Private Netz gibt, also wuerde ich 2 Adapater finden.

Unterscheidbar ist das Ganze fuer mich in der Form, dass es nur beim Public Netzt eine Defaultgateway gibt, also koennte ich zusaetzlich darauf filtern, dies endet aber leider mit einem Fehler, vermutlich weil die Eigenschaft keine String ist sondern eine Tabelle, weil die Moeglichkeit besteht mehrere Gateways zu setzen.

IPEnabled                    : True
...
DefaultIPGateway             : {8.8.8.8}

$NWCard = Get-WmiObject win32_networkadapterconfiguration -Computer Name -filter "ipenabled = 'true' and DefaultIPGateway <> ''"
Get-WmiObject : Invalid query
At line:1 char:24
+ $NWCard = Get-WmiObject <<<<  win32_networkadapterconfiguration -Computer Name -filter "ipenabled = 'true'
and DefaultIPGateway <> ''"
    + CategoryInfo          : InvalidOperation: (:) [Get-WmiObject], ManagementException
    + FullyQualifiedErrorId : GetWMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand

Geht dies mit irgendeinem Trick doch direkt im Filter? Ansonsten muesste ich das Ergebnis, was ja dann zwei Adapter sind ueber z.B: eine Forech durchsuchen um die gewollte zu finden. Das wurde ich mir aber gerne sparen, wenn moeglich.

Oder gibt es anderen Moeglichkeiten per WMI den "HauptAdapter" zu finden?

Vielen Dank.

Beste Gruesse
brima

Get-WinEvent von Forwarded Events , Inhalt ausgeben

$
0
0

Hallo,

ich sammle per Subscription bestimmte Events zusammen.

Jetzt möchte ich das bei bestimmten Events eine Email mit dem Inhalt des Events verschickt wird.

Bisher habe ich es aber nicht geschafft den Inhalt des Events auszugeben.

hier mein

Get-WinEvent -LogName "ForwardedEvents" -FilterXPath "*[System[(EventID=1116)]]" -MaxEvents 1 | format-table * -autosize

Das Feld Message, in dem ich den text vermute ist leer.

gruss max

powerShell Pack für powerShell 3.0

$
0
0

Gibt es das powerShell Pack für powerShell 3.0.

Das WPK Module funktioniert mit dem .Net Framework 4.0 nicht mehr.


Aufruf von Powershell Scripts außerhalb von Powershell

$
0
0

Ich beschäftige mich ganz neu mit Powershell und habe eine grundsätzliche Frage zum Aufruf von Powershell Scripts aus der MS-Aufgabenplanung bzw. aus einem Kommandofenster, jedenfalls nicht aus dem Powershell-Commando Fenster oder der ISE.

Ich benutze folgende Varianten:

param

  ( [string] $InputPath, [string] $Filter, [string] $OutputPath,  [int] $MinAge, [string] $Mode )

function Main-Function ### diese function wird von außerhalb aufgerufen
{

   ... code von Main-Function

   ...

  function Inner-Function1

  {

           param
            (
                [Parameter(Mandatory=$true, ValueFromPipeline=$true)]
                [string]
                $QNumber
            )

  }

  function Inner-Function2()

  {

  }

}

Main-Function -InputPath $InputPath -Filter $Filter -OutputPath $OutputPath -MinAge $MinAge -Mode $Mode } ##am Ende des Scripts

----

was ist der grundsätzlich Unterschied dazu, wenn man die Aufrufparamter neben dem Function-Name schreibt:

function Main-Function ( [string] $InputPath, [string] $Filter, [string] $OutputPath,  [int] $MinAge , [string] $Mode )

{

}

Main-Function -InputPath $InputPath -Filter $Filter -OutputPath $OutputPath -MinAge $MinAge -Mode $Mode } ##am Ende des Scripts

Muss am Ende des Scripts die Aufruf-Zeile mit dem Function-Name und Parametern stehen?

---

Aufruf des Scripts aus der Aufgabenplanung

powershell.exe -noprofile -ExecutionPolicy Bypass -File <Path>\Main-Function.ps1 Param1 Param2 Param3 Param4 Param5

Nachdem mehrere Verzeichnisse verarbeitet werden, ist es State of the Art  die einzelnen Powershell.exe Aufrufe in einer *.BAT File zusammenzufassen und in der Aufgabenplanung mit einem Aufruf der *.BAT File zeitgesteuert aufzurufen - Oder ist das ein Kunstfehler? Alternative wäre, mehrere Job-Einträge in der Aufgabenplanung des gleichen Scripts mit unterschiedlichen Parametern.


Siegmund Sonntag

Ursprung des "Domains" Property

$
0
0

Hallo zusammen,

mit dem Aufruf von "[System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest().Sites" bekomme ich alle Sites meines Forests.

Diese Liste der Sites enthält jeweils ein Property pro Site was sich "Domains" nennt. Kann mir jemand sagen, woher dieses kommt?´Wenn ich mir die Attribute einer Site in ADSI Edit ansehe, dann gibt es dort kein Property "Domains".

Meine erste Vermutung war, dass es sich dabei evtl. um Domains von DCs handelt, die sich in dieser Site befinden. Ich habe allerdings etliche Beispiele gefunden, wo dieses Property einfach leer ist ("{}"), die Site allerdings trotzdem einen aktiven DC beinhaltet.

NTFS Berechtigungen vergeben

$
0
0

Hallo,

Ich arbeite mit:

System.Security.AccessControl.PropagationFlags

um Rechte auf Verzeichnisse zu vergeben nun ist meine simple Frage: Wenn ich nun in das Verzeichnis unter dem Reiter Sicherheit reinschaue, sind dort keine Häckchen gesetzt z.B. bei "Vollzugriff", sondern die Rechte sind unter "Spezielle Berechtigungen" vergeben, warum und macht da einen Unterschied?


Domenicc TechNet Foren Thanks

Zu einer Tabelle eine Spalte hinzufügen und automatisch füllen

$
0
0

Hi,

ich gebe folgende Zeile ein:

get-wmiobject -class "Win32_Product" -namespace "root\CIMV2" -computername "meincomputer" | select-objectComputername, Vendor, Name, Version

dann kommt das:

Computername                          Vendor                                                   Name                                                                     Version
------------                                    ------                                                      ----                                                                        -------
                                                  Microsoft Corporation                             Microsoft Office Access MUI (German) 2010             14.0.6029.1000
                                                  Microsoft Corporation                             Microsoft Office Office 64-bit Components 2010      14.0.6029.1000
                                                  Microsoft Corporation                             Microsoft Office Shared 64-bit MUI (German) 2010  14.0.6029.1000
                                                  Microsoft Corporation                             Microsoft Office Proofing (German) 2010                  14.0.6029.1000
                                                  Microsoft Corporation                             Microsoft Office Shared MUI (German) 2010             14.0.6029.1000
                                                  Microsoft Corporation                             Microsoft Office Proof (Italian) 2010                         14.0.6029.1000

........

Jetzt habe ich in der Ausgabe die Spalte Computername künstlich hinzugefügt.

Ich hätte nun gern in jeder Zeile "meincomputer" in der SpalteComputername stehen.

Warum? Ich möchte alle Domänen PCs auslesen und das Ergebnis in eine Datei schreiben, welche später in eine Datenbank importiert wird.

Ich möchte vermeiden, für jeden PC eine eigene Liste zu erstellen.

Hat jemand ein Idee. wie man das machen könnte?

Vielen Dank!




Automatisch symbol. Links erstellen

$
0
0

Hallo Technet-Forum

Mein Auftrag ist, alle Dateien auf D:\ , die schon 2 Jahre nicht geändert worden sind, auf Laufwerk E:\ zu schieben. Dann sollen automatisch symbolische Links erstellt werden, damit die Dateien von D:\ aus geöffnet werden können. Ich habe soweit alle Codeteile zusammen, aber es klappt nicht  wegen der arrays oder so.

$cold = Get-childitem -path D:\  -recurse | Where-object {$_.Lastwritetime -lt (get-date).AddYears(-2)}  | foreach {$_.Fullname}

foreach($element in $cold)  {$elementname = split-path $element -noqualifier }  # für symbol. Link

#verschiebt:    Get-childitem -path D:\  -recurse | Where-object {$_.Lastwritetime -lt (get-date).AddYears(-2)} | move-item -destination E:\ ;

$colddata = dir E:\

#symbol. Links (/D) aus cmd hochholen ( cmd /c ) , dann Linkname D:$cold, dann realer Speicher (E:\)

foreach($colddatei in $colddata) {cmd /c "mklink /D D:$elementname  E:\ "}

#Es wird nur der erste Symbol. Link angelegt, dann heißt es : kann nicht erstellt werden -->Datei bereits vorhanden--> muss am array liegen, oder?

Freue mich sehr über Hilfe!

Viewing all 2314 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>