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

$error bzw. $? auswerten und in Textdatei ausgeben

$
0
0

Moin!

Ich habe ein Problem und weiß nicht wo das Problem liegt..

Folgender Code:

If($error -gt 0){
        Out-File -Append C:\PowerShellResult.txt -InputObject 'Es sind Fehler aufgetreten! Bitte überprüfen Sie C:\Errors.txt'
        $error[0..100] | Out-File C:\Errors.txt       
        }
        else
        {
        Out-File -Append C:\PowerShellResult.txt -InputObject 'Es sind keine Fehler aufgetreten!'
}

Ich bekomme immer die Fehlermeldung, dass die Abschließende "}" in der Anweisung fehlt.

Getestete Alternativen:

IF($error.Caption(0..100)){} etc. ergibt immer den gleichen Fehler. Daran liegt es wohl nicht.

Ohne IF(){}else{} also:

$error(0..100) | Out-File C:\Errors.txt

Klappt wunderbar..

Ähnlich wenig Erfolg habe ich wenn ich mit:

If($?){
        Out-File -Append C:\PowerShellResult.txt -InputObject 'Es sind Fehler aufgetreten! Bitte überprüfen Sie C:\Errors.txt'
        $error[0..100] | Out-File C:\Errors.txt       
        }
        else
        {
        Out-File -Append C:\PowerShellResult.txt -InputObject 'Es sind keine Fehler aufgetreten!'
}

"$error[0..100]" kann ich natürlich nicht einfach durch "$?[0]" ersetzen, weil ich die Fehlermeldung und nicht "True" in der Textdatei haben möchte. Zudem möchte ich die If-Abfrage ja nicht nach jedem Befehl schreiben.

Bin noch lang kein Profi!

Was übersehe ich da??


seltsame Ablauffolge

$
0
0

Hallo,

ich entwickle schon einige Jahre mit VB(A), PL/SQL, JScript, VB-Script und Batch. Nun fange ich an mich mit PowerShell zu beschäftigen. Ich habe nun eine Funktion erstellt, mit Werte aus einer INI-Datei zurückliefern soll:

function Get-ConfigINIValue([string]$sINIFilename, [string]$sSection, [string]$sKey)
    {
    [string]$sPatternComment = ";*"
    [string]$sPatternSectionElse = "[*]*"
    [string]$sPatternSectionThis = "[" + $sSection + "]*"
    [string]$sPatternKeyThis = $sKey + "=*"

    [boolean]$InSection = $false
   
    Write-Output "- IN-Parameters ------"
    Write-Output "INIFile: $sINIFilename"
    Write-Output "Section: $sSection"
    Write-Output "Key    : $sKey"
    Write-Output "----------------------"
    
    Write-Output "- Pattern ------------"
    Write-Output "Comment: $sPatternComment"
    Write-Output "SecElse: $sPatternSectionElse"
    Write-Output "SecThis: $sPatternSectionThis"
    Write-Output "KeyThis: $sPatternKeyThis"
    Write-Output "----------------------"

    $sContent = Get-Content $sINIFilename
    $sRetVal = "not found" # NUR ZU TESTZWECKEN
    ForEach ($s in $sContent)
        {
        Write-Output "$s"
        
        If ($s -like $sPatternComment)
            {
            # Kommentare ignorieren
            Write-Output "... something to ignore"
            }
        ElseIf ($s -like $sPatternSectionThis)
            {
            Write-Output "... found my section"
            $InSection = $true
            }
        ElseIf ($s -like $sPatternSectionElse)
            {
            Write-Output "... found other section"
            $InSection = $false
            }
        ElseIf ($InSection -eq $true)
            {
            Write-Output "... check the key"
            If (($s -like $sPatternKeyThis))
                {
                Write-Output "... yes, it is"
                $sRetVal = $s.SubString($s.IndexOf("=") + 1)
                }
            }
        Else
            {
            Write-Output "... nothing to do???"
            }       
        }
    return $sRetVal
    }

Leider verhält sich das If-Konstrukt nicht so, wie ich es möchte. Es wird immer eine Element zu spät in eine If-Block verzweigt?!? Zur Veranschaulichung folgendes Beispiel:

Inhalt INI-Datei:

; abweichender DB-Standort
[Data Source]
SourceDir=\\Test\my\location
[End]

Ausgabe des Scripts:

- IN-Parameters ------
INIFile: C:\Dokumente und Einstellungen\Ifm001\Desktop\Test_Reg.ini
Section: Data Source
Key    : SourceDir
----------------------
- Pattern ------------
Comment: ;*
SecElse: [*]*
SecThis: [Data Source]*
KeyThis: SourceDir=*
----------------------
; abweichender DB-Standort
... something to ignore
[Data Source]
... nothing to do???
SourceDir=\\Test\my\location
... found my section
[End]
... check the key

Erwartet hätte ich:

; abweichender DB-Standort
... something to ignore
[Data Source]
... found my section
SourceDir=\\Test\my\location
... check the key
... yes, it is
[End]
... found other section

Findet wer von hier meinen Denkfehler?

Vielen Dank im Vorraus ...

seltsame Ablauffolge mit -like

$
0
0

Hallo,

ich entwickle schon einige Jahre mit VB(A), PL/SQL, JScript, VB-Script und Batch. Nun fange ich an mich mit PowerShell zu beschäftigen. Ich habe nun eine Funktion erstellt, mit Werte aus einer INI-Datei zurückliefern soll:

function Get-ConfigINIValue([string]$sINIFilename, [string]$sSection, [string]$sKey)    {    [string]$sPatternComment = ";*"    [string]$sPatternSectionElse = "[*]*"    [string]$sPatternSectionThis = "[" + $sSection + "]*"    [string]$sPatternKeyThis = $sKey + "=*"    [boolean]$InSection = $false        Write-Output "- IN-Parameters ------"     Write-Output "INIFile: $sINIFilename"    Write-Output "Section: $sSection"    Write-Output "Key    : $sKey"    Write-Output "----------------------"         Write-Output "- Pattern ------------"     Write-Output "Comment: $sPatternComment"    Write-Output "SecElse: $sPatternSectionElse"    Write-Output "SecThis: $sPatternSectionThis"    Write-Output "KeyThis: $sPatternKeyThis"    Write-Output "----------------------"     $sContent = Get-Content $sINIFilename    $sRetVal = "not found" # NUR ZU TESTZWECKEN    ForEach ($s in $sContent)        {        Write-Output "$s"                If ($s -like $sPatternComment)            {            # Kommentare ignorieren            Write-Output "... something to ignore"            }        ElseIf ($s -like $sPatternSectionThis)            {            Write-Output "... found my section"            $InSection = $true            }        ElseIf ($s -like $sPatternSectionElse)            {            Write-Output "... found other section"            $InSection = $false            }        ElseIf ($InSection -eq $true)            {            Write-Output "... check the key"            If (($s -like $sPatternKeyThis))                {                Write-Output "... yes, it is"                $sRetVal = $s.SubString($s.IndexOf("=") + 1)                }            }        Else            {            Write-Output "... nothing to do???"            }               }    return $sRetVal    }

Leider verhält sich das If-Konstrukt nicht so, wie ich es möchte. Es wird immer eine Element zu spät in eine If-Block verzweigt?!? Zur Veranschaulichung folgendes Beispiel:

Inhalt INI-Datei:

; abweichender DB-Standort
[Data Source]
SourceDir=\\Test\my\location
[End]

Ausgabe des Scripts:

- IN-Parameters ------
INIFile: C:\Dokumente und Einstellungen\Ifm001\Desktop\Test_Reg.ini
Section: Data Source
Key    : SourceDir
----------------------
- Pattern ------------
Comment: ;*
SecElse: [*]*
SecThis: [Data Source]*
KeyThis: SourceDir=*
----------------------
; abweichender DB-Standort
... something to ignore
[Data Source]
... nothing to do???
SourceDir=\\Test\my\location
... found my section
[End]
... check the key

Erwartet hätte ich:

; abweichender DB-Standort
... something to ignore
[Data Source]
... found my section
SourceDir=\\Test\my\location
... check the key
... yes, it is
[End]
... found other section

Findet wer von hier meinen Denkfehler?

Vielen Dank im Vorraus ...


Create Folder with ACL

$
0
0

Hello,

kennt jemand ein Script das folgendes ausführt.

1. Folder erstellen zB (Max Mustermann)

2. Es sollte nur der User (Max Mustermann) r/w auf den Folder haben. Keine anderen User sollten Zugriff auf den Folder haben

Die User sind alle AD User

Vielleicht könnte mir jemand dabei helfen

den untersten Directory Level finden

Benutzerabfrage über alle Sub-Domains

$
0
0

Hallo,

eine Benutzersuche mit der MMC Active Directory-Benutzer und -Computer bietet bei "suchen in" als Auswahl "gesamtes Verzeichnis" und liefert als Ergebnis -wie gewünscht- Benutzer aus der Domäne und den Subdomänen. Meine Adminrechte reichen hierfür offensichtlich vollkommen aus.

Versuche ich das Ganze über ein Powershellscript (unterschiedlichste Beispiele finden sich im Netz zuhauf), werden die Abfragen der Sub-Domains mit allen möglichen Fehlern quittiert.  

Ein Beispiel:
Get-ADUser -Filter { Name -Like "Müller*" } -Searchbase "DC=Domäne,DC=de"  -> das funktioniert

Get-ADUser -Filter { Name -Like "Müller*" } -Searchbase "DC=Subdomäne,DC=Domäne,DC=de" 

bringt folgende Fehlermeldung: ADUser : Eine Referenzauswertung wurde vom Server zurückgesendet.

Egal welches Script ich auch ausprobiere, es scheitert immer an der Subdomain.



ZIP-Datei per Powershell produziert Fehler

$
0
0

Moin moin,

ich habe ein Backup-Skript geschrieben, was nun einen kleinen Schönheitsfehler hat... Und zwar werden die ZIP-Dateien anscheinend nicht ordentlich geschlossen...

Fehlermeldung nach dem ZIP-Vorgang:
Title: Compressed (zipped) Folders Error
Body: Windows cannot open the folder.
Access to the Compressed (zipped) Folder 'C:\abc\Backup.zip' is denied.

Kann mir jemand dabei weiterhelfen?

Skript:

Param(
    [Parameter(Mandatory=$True)][ValidateScript({Test-Path $_})][String]$SourceDirectory,
    [Parameter(Mandatory=$True)][ValidateScript({Test-Path $_})][String]$DestinationDirectory,
    [Parameter(Mandatory=$True)][ValidateScript({0 -lt $_})][String]$MaxWeekBackup,
    [Array]$requiredProcess,
    [string]$Mail_Receiver
)
Clear-Host

$Mail_Channel = "aa@bb.de"
$Mail_smtpServer = "mailout.de"
$Mail_subject = "Backup "
$PC_Name = $(Get-WmiObject Win32_Computersystem).name
$successful = $true
$ZIP_create_Wait = 500
$ZIP_finish_Wait = 30000

$datum = Get-Date
$DayOfWeek = $datum.DayOfWeek
$PSConsoleLog = $DestinationDirectory + "\PSConsole_" + $DayOfWeek + ".log"

#Quelle: http://www.admin-source.de/BlogDeu/450/powershell-zip-ohne-module-oder-externe-programme
function Add-Zip() {

  param (
    [array]$PackFilesPath,
    [string]$DestinationZipPath
  )

  ### Create the ZIP File if it is not existing
  Write-Host ""
  Write-Host -backgroundcolor blue "" "// Start the ZIP-Process\\"

  if(-not (Test-Path ($DestinationZipPath))) {

      ### Write ZIP File-header to File
      Set-Content $DestinationZipPath (“PK”+ [char]5 + [char]6 + (“$([char]0)”* 18))

      Write-Host -NoNewline -ForegroundColor Yellow "Create ZIP-File: "
      Write-Host $DestinationZipPath
  }
  ### remove read only flag from File
  $zip=Get-Item $DestinationZipPath
  $zip.IsReadOnly = $false

  ### we need the Fullpath to the File
  $DestinationZipPath = $zip.FullName

  ### Create the Shell COM Object
  $ShellApplication = New-Object -ComObject Shell.Application

  ### Create the COM Folder Object from ZIP File
  $ZipFolder=$ShellApplication.NameSpace($DestinationZipPath)

  ### Process Files given with the as Parameter Argument
  ### Pack file(s) into ZIP Package
  
  If($PackFilesPath) {

        Foreach($File in $PackFilesPath) {
            ### Pack file into Package
            $ZipFolder.CopyHere($File)

            Write-Host -NoNewline -ForegroundColor Yellow "Copy "
            Write-Host $File

            ### Try to wait to finish the copy action
            Write-Host -ForegroundColor Yellow ("Wait: " + $ZIP_create_Wait)
            Start-sleep -milliseconds $ZIP_create_Wait
      }
  }

  ### Process Files comming from Pipeline $input.
  ### Pack file(s) into ZIP Package
  If($input) {
    Foreach($file in $input) {

      ### Pack file into Package
      $ZipFolder.CopyHere($file.FullName)

      Write-Host -NoNewline -ForegroundColor Yellow "Copy "
      Write-Host $File.FullName
      ### Try to wait to finish the copy action
      Write-Host -ForegroundColor Yellow ("Wait: " + $ZIP_create_Wait)
      Start-sleep -milliseconds $ZIP_create_Wait
    }
  }
  Write-Host -backgroundcolor darkblue "\\Finish the ZIP-Process//" ""
  Write-Host ""
  Write-Host -ForegroundColor Yellow ("Wait: " + $ZIP_finish_Wait)

  Start-sleep -milliseconds $ZIP_finish_Wait
}

function refreshDir($dir){
    if(Test-Path ($dir)) {

        ### Loesche Pfad
        Write-Host -NoNewline -ForegroundColor Yellow "Delete:     "
        Write-Host -NoNewline $dir 

        Remove-Item -Path $dir -Recurse -Include *

        ### Ausgabe des Status
        If (Test-Path $dir) {Write-Host -foregroundcolor red " -unsuccessfully"} else {Write-Host -foregroundcolor green " -successfully" ""}
    }
}


refreshDir $PSConsoleLog
start-transcript $PSConsoleLog -append

Write-Host ""
Write-Host -backgroundcolor blue "" "//////works\\\\\\" ""
Write-Host ""
Write-Host -backgroundcolor darkgreen "" "---------------|Stop Services|---------------"
$requiredProcessList = New-Object System.Collections.ArrayList

if ($requiredProcess.Length -ne 0){
    for($i = 0; $requiredProcess.Length -gt $i ; $i++){
        $GetService = $true
        try {$y = Get-Service $requiredProcess[$i] -ErrorAction Stop} catch {$GetService = $false}

        if ($GetService -eq $true){
            $StopService = $true

            Write-Host -NoNewline -ForegroundColor Yellow "Stop Service:       " 
            Write-Host $requiredProcess[$i]

            try {Stop-Service $requiredProcess[$i] -ErrorAction Stop} catch {$StopService = $false}
           
            Write-Host ""
            Write-Host -backgroundcolor blue "" "/// Service state \\\"
            get-Service $requiredProcess[$i]
            Write-Host -backgroundcolor darkblue "" "\\\ Service state ///" ""
            Write-Host ""

            if ($StopService -eq $true){
                $requiredProcessList.Add($requiredProcess[$i])

            } else {
                $successful = $false
                Write-Host -ForegroundColor red ("Error:      required Service " + $requiredProcess[$i] + " no exsist!")
            }
        } 
    }

    ### Ueberspeichere Array, damit alle gefundenen Services wieder gestartet werden
    $requiredProcess = $requiredProcessList
}

Write-Host -backgroundcolor darkgreen "" "------------------|Backup|-------------------"
if ($successful -eq $true){
    If ($DayOfWeek -eq "Sunday"){
        ### Woechentlicher Pfad und kopiere Dateien
        $KW = (Get-Date -UFormat %W ) + 1
        $Floor = [Math]::Floor($KW / $MaxWeekBackup)
        $WeekNumber =  $KW - ($Floor * $MaxWeekBackup)
        $BackupDir = $DestinationDirectory + "\Week_" + $WeekNumber + ".zip"

    } else {       
        ### Taeglicher Pfad und kopiere Dateien
        $BackupDir = $DestinationDirectory + "\Day_" + $DayOfWeek + ".zip"
    }

    ### Direktory vorbereiten / alte löschen
    refreshDir $BackupDir
     
    ### Direktory move
    Write-Host ""
    Write-Host -backgroundcolor blue "" "//// Copyprocess \\\\"

    Write-Host -NoNewline -ForegroundColor Yellow "Form:       "
    Write-Host $SourceDirectory
    Write-Host -NoNewline -ForegroundColor Yellow "To:         " 
    Write-Host $BackupDir

    Add-Zip $SourceDirectory $BackupDir
    
    ### Prüfe ob Moveingprozess funktionierte
    If (Test-Path $BackupDir){
        Write-Host -NoNewline -ForegroundColor yellow "Copyprocess:        "
        Write-Host -ForegroundColor green  "Copyprocess was successful"

    } else {
        Write-Host -NoNewline -ForegroundColor yellow "Copyprocess:        "
        Write-Host -ForegroundColor red "Copyprocess was unsuccessful - Error"
        $successful = $false
    }
    Write-Host -backgroundcolor darkblue "\\\\ Copyprocess ////" ""
    Write-Host ""

} else {
    Write-Host -ForegroundColor red "Error:      No copy option!"
}

Write-Host -backgroundcolor darkgreen "" "---------------|Start Services|---------------"

if ($requiredProcess.Length -ne 0){
    for($i = 0; $requiredProcess.Length -gt $i ; $i++){
        Write-Host -NoNewline -ForegroundColor Yellow "Start Process:     " 
        Write-Host $requiredProcess[$i]

        Start-Service $requiredProcess[$i]
    }
}

Write-Host -backgroundcolor darkblue "" "\\\\\\finish//////" ""
Write-Host ""

stop-transcript
$PSConsoleString = [IO.File]::ReadAllText($PSConsoleLog)

if ($Mail_Receiver -ne ""){
    Write-Host ""
    Write-Host -backgroundcolor darkgreen "" "------------------|Send Mail|-------------------"

    if ($successful -eq $true) {
            
        ### Header erstellen "Erfolgreich"
        $subject = $Mail_subject + "Successfully - " + $PC_Name
    } else {

        ### Header erstellen "Erfolglos"
        $subject = $Mail_subject + "Error - " + $PC_Name
    }

    ### Mail wird versendet
    Send-MailMessage -To $Mail_Receiver -Subject $subject -Body $PSConsoleString -From $Mail_Channel -SmtpServer $Mail_smtpServer
    Write-Host -NoNewline -ForegroundColor Yellow "Send Mail to: "
    Write-Host $Mail_Receiver
}

Write-Host ""
Write-Host -backgroundcolor darkgreen "" "------------------|EventLog|-------------------"
$source = "PowerShell-BackupSkript"
### Lege Pfad an
if ([System.Diagnostics.EventLog]::SourceExists($source) -eq $false) {
    [System.Diagnostics.EventLog]::CreateEventSource($source, "Application")
    Write-Host -NoNewline -ForegroundColor Yellow "eventlog-ID:        "
    Write-Host $source
}
### Bestimme Fehlertyp
if ($successful -eq $true) {
    ### Erfolgreich
    $EntryType = "Information"
    $eventID = "9465"
} else {

    ### Erfolglos
    $EntryType = "Warning" #or Error
    $eventID = "58858"
}

write-eventlog -logname Application -Source $source -eventID $eventID -message $PSConsoleString -EntryType $EntryType
Write-Host -ForegroundColor Yellow "Create eventlog:    "
Write-Host -NoNewline -ForegroundColor Yellow "eventlog-ID:        "
Write-Host $eventID
Write-Host -NoNewline -ForegroundColor Yellow "eventlog_EntryType: "
Write-Host $EntryType

Get-aduser mit -filter -not

$
0
0

Hallo,

über folgenden Befehl kann ich mir alle Aktiven User anzeigen lassen, diese im Namen den String "meier" haben:

Get-aduser -filter {(-not (useraccountcontrol -like "514"))  -and ((EmailAddress -like "*.de") -or (EmailAddress -like "*.com")) -and (surname -like "*meier*")} -properties * | FT useraccountcontrol,givenname,surname,samaccountname,EmailAddress

Jedoch schaffe ich es nicht, den Bereich "-not" mit dem Parameter "useraccountcontrol -like "66050" zu erweitern?

Mein Ziel ist es, dass ich eine Liste bekomme, in dieser weder der useraccountcontrol 514 noch der useraccountcontrol 66050 enthalten ist.

Wer kann mir hier bitte helfen?

Danke


Wie kann die Ausgabe von Write-Verbose verhindert werden?

$
0
0

Hallo zusammen,

ich habe ein Script welches Funktionen enthält, die ich in anderen Scripten verwenden möchte. Das Script mit den Funktionen enthält eine Zeile, die die Variable VerbosePreference auf "Continue" stellt, also in etwa so:

function neue-Funktion ()
{
set-variable VerbosePreference -value Continue
write-verbose "Text"
}

Ich darf das Script mit den Funktionen nicht verändern, kann also nicht die Zeile mit set-variable entfernen. Möchte aber in meinen Script auf die Funktion zugreifen und die Ausgabe unterdrücken:

. c:\scriptmitfunktionen.ps1
neue-Funktion

Lässt es sich verhindern das die Funktion "Neue-Funktion" die Ausgabe "Ausführlich: Text" in der Konsole ausgibt? Ich würde mich über Vorschläge freuen.

Gruß, Frank

Deaktivierte User filtern und aus entsprechenden Gruppen löschen

$
0
0

Hallo zusammen,

ich habe folgendes Problem:

Ich habe diverse AD-Gruppen, die ich zusammengefasst in einem Powershellscript überprüfen will, ob dort deaktivierte User enthalten sind und wenn ja diese aus den Gruppen entfernen.

Das Auslesen der deaktivierten User bekomme ich hin, nur diese dann aus den Gruppen entfernen funktioniert nicht so wie ich mir das vorstelle, wahrscheinlich habe ich nur einen kleinen Denkfehler.

Wenn ich die deaktivierten User aus einer bestimmten Gruppe löschen will klappt dies und ich nehme folgenden Befehl:

Get-ADGroupMember -Identity "BEISPIEL_GRUPPE" | Get-ADUser | Where-Object {$_.Enabled -eq $False} | ForEach-Object {Remove-ADGroupMember -Identity "BEISPIEL_GRUPPE" -Members $_ -Confirm:$false}

Ich möchte das löschen aber wie folgt umsetzen:

get-adgroup -filter {name -like "*BEISPIEL*"} | Get-ADGroupMember | Get-ADUser | Where-Object {$_.Enabled -eq $False} 

Über den genannten Befehl habe ich alle "BEISPIEL" Gruppen ausgelesen und die darin befindlichen deaktivierten User.

Nun möchte ich die ausgelesenen User aus den gesamten "BEISPIEL" Gruppen löschen. Ich habe es versucht über eine Variable und direkte Befehle aber komme leider nicht zum gewünschten Ergebnis.

Wieso wird falsch gezählt?

$
0
0

Hallo,

ich möchte über ein PowerShell Script auswerten, wie viele Citrix-Server in einem bestimmten Status sind.

# Citrix Snapin laden
Add-PSSnapin "Citrix.XenApp.Commands" -EA 0

# Zähle wie viele Server der WorkerGroup Desktop im LogOn Status 'False' sind
(Get-XAServer -WorkerGroupName Desktop | Where-Object {$_.LogOnsEnabled -match "False"} | Select-Object ServerName,LogOnsEnabled | Format-Table -AutoSize).count

Hier bekomme ich die Zahl "5" angezeigt. Lasse ich die äußeren Klammern und das .count weg, bekomme ich allerdings nur einen Server angezeigt.

Get-XAServer -WorkerGroupName Desktop | Where-Object {$_.LogOnsEnabled -match "False"} | Select-Object ServerName,LogOnsEnabled | Format-Table -AutoSize

Ausgabe:

ServerName LogOnsEnabled
---------- -------------
TERM0815           False

Jemand eine Idee? Mit HideTableHeaders habe ich es bereits probiert, bringt auch nichts.

Danke und Gruß

Steffen

Migration XCOPY /D

$
0
0

Hallo,

ich bin auf der Suche nach einer Umsetzung von "XCOPY [...] /D" nach PowerShell (also Kopieren von Dateien, wenn sie im Zielordner entweder nicht existiert oder dort älter ist, als im Quellordner). Bei Copy-Item habe ich keine Möglichkeit gefunden. -Filter hat mich angelächelt, aber was damit anstellbar ist habe ich noch nicht verstanden.

Oder muss ich das "zu Fuss" lösen (Dateidatum auf beiden Seiten ermitteln und vergleichen)?

Bitte keine Lösungen mit irgendwelchen Zusatz-Werkzeugen.

Zusatzfrage:Copy-Item "C:\foo\bar.txt" "C:\foo\bar2.txt"überschreibt bei mir eine alte bar2.txt. Nach meinem Verständnis sollte das nicht so sein, wenn -Force nicht verwendet wird. AN irgendwelchen Statdardparametern habe ich nicht gedreht. Was habe ich übersehen?

Vielen Dank im Vorraus



Powershell Skript startet nicht über Batch-Datei

$
0
0

Hallo zusammen

Ich habe ein Powershell Skript, welches Dateien mittels 'zip.exe' in ein anderes Laufwerk zippt.
Dieses Skript wird über eine Batch-Datei (.bat) ausgeführt, welche beim Start von einem Service einmalig gestartet wird.

Auf einem System funktioniert es über die Batch-Datei (Powershell startet, zippt, etc.) auf dem anderen nicht.

Batch-Zeile: START powershell.exe -Command "& C:\scripts\Zip-Logs.ps1 -OutputPath 'G:\'

Der Rest der Batch-Datei wird aber ausgeführt auf allen Systemen!

Was ich bisher versucht habe:
NTFS-Berechtigungen des Service-User auf Skript-Pfad, Zip-Pfad und Pfad der zu zippenden Dateien.
gpedit.msc -> Log on as batch, log on as service

Andere Ideen oder wie kann ich so etwas debuggen, wenn alles ausgeführt wird ausser Powershell?

Grüsse

Backup per PowerShell prüfen

$
0
0

Hallo,

ich möchte das tägliche Backup mit einem Script prüfen. Dazu habe ich folgende Anweisung erstellt:

wevtutil qe Microsoft-Windows-Backup /f:text /q:"*[System/Eve
ntID=14] and *[EventData/Data[@Name='HRESULT']='0']"

Als Ergenis erhalte ich nun alle Einträge mit entsprechenden Kriterien. Nun möchte ich die Anweisung so eingrenzen, das nur die Einträge vom Vortag aufgelistet werden. Ich bekomme das leider nicht hin. Kann mir jemand helfen?

Gruß

Michael

Powershell User in andere Sicherheitsgruppen verschieben

$
0
0

Hallo zusammen,

ich habe mal wieder ein Powershell "Problem". Folgende Situation:

Ich möchte alle User aus einer Sicherheitsgruppe in eine andere Sicherheitsgruppe verschieben. Ich habe mir jetzt wie folgt geholfen:

$NEU = Get-ADGroup -filter {Name -like '*GRUPPE_1*'} 
$ALT = Get-ADGroup -filter {Name -like '*GRUPPE_2*'}

$alt | Get-ADGroupMember | foreach { Add-ADGroupMember  $NEU.DistinguishedName  -Members $_  } 
$alt | Get-ADGroupMember | foreach { Remove-ADGroupMember $alt.DistinguishedName -Members $_ }

Ich bekomme es nicht hin außer den User erst in die neue Gruppe zu kopieren und danach die User aus der alten Gruppe zu löschen.

Hat jemand einen Tipp wo ggf. mein Denkfehler ist?


suche ps script zum ändern von passwörtern bei services

$
0
0

Hallo zusammen,

ich suche nach einer Möglichkeit die mir bei allen Services die unter einem bestimmten Benutzer XYZ laufen das passwört ändert.


Chris

Powershell Script for adding CT fails

$
0
0

#FÜR ALLE WEBS aller SITECOL und Subweb


 


$WEB_APPLICATION_URL

="http://aktiv/"


$lookForCT

="Arbeitsbereich Excel"  #Excel  or Powerpoint


$lookForList

="Dokumente"




$webApplication

=Get-SPWebApplication-identity$WEB_APPLICATION_URL


#Get site object and

#specify name of the content type to look for in each library


 

 

 


ForEach

($siteCollectionin$webApplication.Sites)

{

  

  

#Walk through each site in the site collection


  

ForEach($subSitein$siteCollection.AllWebs)

      {

       

write-host"Checking site:"$subSite.URL

       

   

    

$update=$false


   

   

#Go through each document library in the site


   

$subSite.Lists|where{$_.Title -eq$lookForList-and$subSite.URL -match'sc002'}|ForEach-Object{

       

       

write-host"Checking list:"$_.Title

       

$_.ContentTypesEnabled=$true


       

$_.Update()

       

      

       

       

#Check to see if the library contains the content type specified


       

#at the start of the script


       

if(($_.ContentTypes|where{$_.Name-eq$lookForCT})-eq$null)

        {

           

write-host"No content type exists with the name"$lookForCT"on list"$_.Title

           

$update=$true;

           

        }

       

else


        {

           

write-host"YES content type exists with the name"$lookForCT"on list"$_.Title

           

        }

       

if($update) {

           

#Add site content types to the list


           

$ctToAdd=$subSite.RootWeb.ContentTypes[$lookForCT]


           

write-host"CT = "$ctToAdd.Name

           

#$ct = $_.ContentTypes.Add($ctToAdd)


           

$ct=$_.Lists[$lookForList].ContentTypes.Add($ctToAdd)

           

write-host"Content type"$ct.Name"added to site "$subSite.URL

           

#$_.Update()


    }

  }

}

}


#Dispose of the site object


$site

.Dispose()

-------------------------------------

Cannot index into a null array.    =====================  WHY?

At line:52 char:13

+             $ctToAdd = $subSite.RootWeb.ContentTypes[$lookForCT]

+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException

    + FullyQualifiedErrorId : NullArray


HC

Festplattenspeicher einzeln einlesen

$
0
0

Hallo liebe Community,

mit folgendem Codeausschnitt lese ich die Laufwerksbuchtaben
sowie die Namen existierender Partitionen einer HDD ein.
Die Variable $server enthält dabei die Serveradresse und da ich
das per Remote mache, gibt es noch die Variable $remote.

Das funktioniert ohne Probleme und ein erster Test zum Schreiben
der Daten in eine MSSQL-DB klappt auch:

# Laufwerke einzeln ausgeben
$drives = Get-WmiObject -ComputerName $server -Class win32_logicaldisk -Credential $remoteuser -filter "drivetype=3"
foreach ($drive in $drives)
{" {0} " -f $drive.DeviceID
	# In DB schreiben...
}

# Drivename einzeln ausgeben
$sizes = Get-WmiObject -ComputerName $server -Class win32_logicaldisk -Credential $remoteuser -filter "drivetype=3"
foreach ($size in $sizes)
{" {0} " -f $size.VolumeName
	# In DB schreiben...
}

Wie kann ich aber nun den Speicherplatz (size, used, free) einzeln einlesen, so dass ich
die Werte anschließend in eine DB schreiben kann?

Mir ist nur folgende Methode bekannt:

		cls
		Write-Host -------------------------------
		Write-Host $server
		Write-Host -------------------------------
		Write-Host
		Get-WmiObject -ComputerName $server -Class win32_logicaldisk -Credential $remoteuser -filter "drivetype=3" | 
		select DeviceID, VolumeName, 
		@{Name="Size (GB)";Expression = {"{0:N1}" -f ($_.Size/1gb)}},
		@{Name="Used (GB)";Expression={"{0:N1}" -f (($_.Size/1gb) - ($_.FreeSpace/1gb))}},
		@{Name="Free (GB)";Expression={"{0:N1}" -f ($_.FreeSpace/1gb)}}
		$variable = gwmi -ComputerName $server -Credential $remoteuser -Class win32_operatingsystem -property lastbootuptime
		$ergebnis = [management.managementDateTimeConverter]::ToDateTime($variable.lastbootuptime)
		Write-Host "Last Boot  : $ergebnis"
		Write-Host
		Write-Host "Press any key for the next page with the next server..."
		$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
		cls
Hier bekomme ich zwar alle angeforderten Daten angezeigt, aber eben alles auf einmal.
Ich benötige jeden Wert einzeln.

Jemand eine Idee?

Danke und Gruß
DD



Script zum Leeren von Temp Ordnern

$
0
0

Hallo allerseits!

Ich hab mir hier ein Script zusammengebaut, welches aus den Temp Ordnern aller lokalen Profile sowie des Systems alle Inhalte löschen soll, die älter als 30 Tage sind. Das Script wird beim Systemstart eines Clients automatisch ausgeführt. Allerdings werden irgendwie nicht alle Elemente gelöscht und vor allem sieht das für mich alles so aus, als würde ich das viel zu umständlich angehen. ;-)

Hat jemand eine Idee, wie sich das Script optimieren ließe?

Write-Host "* Cleanup TEMP Folder Script" -foregroundcolor Cyan

Function DeleteOldFiles([string]$directory)
{
  Get-ChildItem $directory -recurse -force -ErrorAction SilentlyContinue | Where {$_.LastWriteTime -lt (Get-Date).adddays(-30) -and -not $_.psiscontainer} |% {
    If (Remove-Item $_.fullname -force -ErrorAction SilentlyContinue) {
	  $LogMessage = "Removing "+$_.fullname
      Write-Host $LogMessage
      Write-Eventlog -Logname Application -Source DelTemp -EventID 2005 -EntryType Information -Message $LogMessage
	}
  }  
  Get-ChildItem -Path $directory -ErrorAction SilentlyContinue | ForEach-Object {
    If ($_.PSIsContainer -eq $true) {
      If ((Get-ChildItem -Path $_.FullName -ErrorAction SilentlyContinue) -eq $null) {
		If (Remove-Item $($_.FullName) -force -ErrorAction SilentlyContinue) {
		  $LogMessage = "Removing "+$($_.FullName)
		  Write-Host $LogMessage
          Write-Eventlog -Logname Application -Source DelTemp -EventID 2005 -EntryType Information -Message $LogMessage
		}
      }
    }
  }   
}

Function DeleteProfileDir([string]$directory)
{
  Write-Host "Checking profile path" $directory
  $tempdir=$directory+"\AppData\Local\Temp"
  If (Test-Path $tempdir -ErrorAction SilentlyContinue)
  {
    Write-Host "Cleaning" $tempdir
    DeleteOldFiles($tempdir)
  }
}

New-Eventlog -Logname Application -Source DelTemp -ErrorAction SilentlyContinue
Write-Eventlog -Logname Application -Source DelTemp -EventID 2001 -EntryType Information -Message "DelTemp Script started."
$profiledirs=Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList' | % {Get-ItemProperty $_.pspath } | Select profileImagePath | ForEach-Object -process {DeleteProfileDir $_.ProfileImagePath}
$wintemp=$env:Windir+"\TEMP"
Write-Host "Cleaning" $wintemp
DeleteOldFiles($wintemp)
Write-Eventlog -Logname Application -Source DelTemp -EventID 2002 -EntryType Information -Message "DelTemp Script finished."

RPC-Server nicht verfügbar (schon viele Lösungsansätze ausprobiert)

$
0
0

Hallöle,

heute eine Frage zum Thema RPC/WMI. Dies betrifft die PowerShell und vor allem WinServ 2008 R2.

...wurde hier im Forum zwar schon oft besprochen, aber eine Lösung habe ich bisher nicht gefunden.

Situation:

Folgendes kleines PowerShell-Skript liest mir von einem Server (Win Serv 2008 R2) die Laufwerke aus:

cls
#$server = "FQDN1"
$server = "FQDN2"
$remoteuser = get-credential Domain\user
Write-Host -------------------------------
Write-Host $server
Write-Host -------------------------------
Write-Host
Get-WmiObject -ComputerName $server -Class win32_logicaldisk -Credential $remoteuser -filter "drivetype=3" | 
select DeviceID, VolumeName, 
@{Name="Size (GB)";Expression = {"{0:N1}" -f ($_.Size/1gb)}},
@{Name="Used (GB)";Expression={"{0:N1}" -f (($_.Size/1gb) - ($_.FreeSpace/1gb))}},
@{Name="Free (GB)";Expression={"{0:N1}" -f ($_.FreeSpace/1gb)}}
Write-Host

Beim ersten Server (beispielhaft FQDN1 genannt) klappt es ohne Schwierigkeiten.

Sobald ich auf einen anderen Server zugreifen moechte (hier FQDN2), bekomme

ich folgende Fehlermeldung:

Get-WmiObject: Der RPC-Server ist nicht verfügbar. (Ausnahme von HRESULT; 0x800706BA)

Vom Client aus kann ich den Server anpingen und mich per Remote verbinden.

Folgende Lösungsansätze habe ich bisher probiert (leider ohne Erfolg):

1.) auf dem Server

netsh advfirewall firewall set rule group="Windows Management Instrumentation (WMI)" new enable=yes

2.) auf dem Client und dem Server

dcomcnfg:

- COM-Internetdienste auf diesem Computer aktivert

- rebbot

3.) auf dem Server

gestartete Dienste:

- Remote Desktop Services

- DCOM Server Process Launcher

- Remote Procedure Call (RPC)

- Remote Procedure Call (RPC) Locator

- Remote Registry

- RPC Endpoint Mapper

4.) auf dem Server

sc \\localhost query RpcSs ergibt:

SERVICE_NAME: RpcSs

TYPE: 20 WIN32_SHARE_PROCESS

STATE: 4 RUNNING

(NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)

WIN32_EXIT_CODE: 0 (0x0)

SERVICE_EXIT_CODE: 0 (0x0)

CHECKPOINT: 0x0

WAIT_HINT: 0x0

5.) auf dem Server

HKLM\SOFTWARE\Microsoft\Ole\

EnableDCOM = Y

6.) auf dem Server

In der Firewall habe ich teils zu Testzwecken u.a. folgende Regeln aktiviert:

- Domain: Remote Administration (RPC)

- Domain: Remote Administration (RPC-EPMAP)

- All: Distributed Transaction Coordinator (RPC)

- All: Distributed Transaction Coordinator (RPC-EPMAP)

- All: Distributed Transaction Coordinator (TCP-In)

- All: Remote Desktop - RemoteFX (TCP-In)

- All: Remote Desktop (TCP-In)

- All: Remote Service Management (RPC)

- All: Remote Service Management (RPC-EPMAP)

- All: Windows Management Instrumentarium (DCOM-IN)

- All: Windows Management Instrumentarium (WMI-IN)

Firewall aus bringt leider auch nichts.

Wie gesagt, zum ersten Server klappt es...nur zum zweiten Server klappt es nicht.

Beide stehen im gleichen Netz und gehören der selben Domäne an.

Ich sehe beim Vergleich der Einstellungen beider Server aber keine Unterschiede.

Wo kann ich noch gucken?

Danke
DD

Viewing all 2314 articles
Browse latest View live


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