태그 보관물: scripting

scripting

GPO / GPP를 통한 프린터 배포-프로그래밍 옵션이 있습니까? 보유하고 있다는

내가 통제 할 수없는 이유로 100 대 이상의 프린터를 1000 대 이상의 클라이언트에 배포하기 위해 GPO / GPP를 설정해야했습니다.

좋은 소식은 우리가 12 개가 넘는 사이트를 보유하고 있다는 것입니다. 대부분 X 사이트의 모든 프린터를 X 사이트의 모든 클라이언트 PC로 푸시 할 수 있습니다.

나쁜 소식은 내가하는 두 가지 방법 ( “인쇄 서버에서 그룹 정책으로 배포 …”GPP / 그룹 정책 기본 설정 사용 )이 내가 원하는 것보다 훨씬 더 많은 수작업을 필요로한다는 것입니다. 인쇄 서버에서 모든 프린터를 선택하고 Deploy with Group Policy...옵션을 사용할 수없는 것처럼 보일 수도 있습니다. 예를 들어, 한 번에 하나씩 수행 할 것으로 예상됩니다. 인쇄 서버에서 프린터 경로를 선택한 다음 프린터 연결에서 얻을 수있는 많은 정보 (예 : 프린터 IP)를 수동으로 입력해야합니다.

인쇄 서버의 모든 프린터를 GPO / GPP에 추가하는 스크립트에 대한 Google-Fu가 비어있었습니다. 반자동 방식 으로도이 작업을 수행하는 다른 방법을 볼 수없는 것 같습니다. 제게 어떤 사람이 GPO에 수백 대의 프린터를 수동으로 추가 할 방법이 없기 때문에 제가 뭔가 빠졌다고 생각합니다.

이상적으로는 GPP를 사용하는 프로그래밍 방식을 찾고 싶지만 상황에 따라 수동으로 프린터를 수동으로 추가하는 데 수십 시간이 걸리지 않는 솔루션은 훌륭 할 것입니다.

누구 든지이 작업을 수행 할 수 있습니까? 아니면 PowerShell 스크립트를 작성하거나 하위 직원을 속여서이 작업을 수행해야합니까?



답변

필자 backup-GPO는 결과적으로 XML 파일을 해킹하고 다시 가져올 수 있기를 희망 하면서도 열심히 노력 했지만, PowerShell 스크립트가 미래에있을 것으로 생각합니다.

그렇게 나쁘진 않네. 가장 가까운 서버에서 프린터 목록을 생성 한 다음 반복하여 매핑 할 수 있습니다.

이 같은:

$net = New-Object -COMObject WScript.Network
$printserver = 'yourserver'

$printerlist = Get-WMIObject -class Win32_Printer -computer $printserver | Where-Object {$_.ShareName -ne $null} | Select-Object ShareName
foreach ($printer in $printerlist)
{
    $printerpath = '\\' + $printserver + '\' + $printer.ShareName
    #echo $printerpath
    $net.AddWindowsPrinterConnection($printerpath)
}

프린터 이름이 논리적으로 지정되어 있고 기계를 식별 할 수있는 논리적 방법이있는 경우 더 세분화 할 수 있습니다. 예를 들어 클라이언트 IP 주소를 가져 와서 가장 가까운 서버를 선택했습니다. 10.20. *와 같은 IP 주소 인 경우 server1로 이동하십시오. 기타.

도움이 되길 바랍니다.

편집하다:

@EvanAnderson의 문서를 보면 XML을 해킹 할 수 있다고 확신합니다.

내 보낸 파일의 관련 비트 (편집 포함) :

<DSObject bkp:Path="CN={GUIDHERE},CN=PushedPrinterConnections,%GPO_MACH_DSPATH%" bkp:SourceExpandedPath="CN={13B9B596-452C-4652-A05D-78EF06610134},CN=PushedPrinterConnections,CN=Machine,CN={44A99FBA-0DB3-484C-808E-3DDAE9932A2B},CN=Policies,CN=System,DC=Domainname,DC=extension" bkp:ObjectClass="msPrint-ConnectionPolicy">
    <DSAttributeMultiString bkp:DSAttrName="showInAdvancedViewOnly">
        <DSValue><![CDATA[TRUE]]></DSValue>
    </DSAttributeMultiString>
    <DSAttributeMultiString bkp:DSAttrName="uNCName">
        <DSValue><![CDATA[\\Servername\PrinterShareName]]></DSValue>
    </DSAttributeMultiString>
    <DSAttributeMultiString bkp:DSAttrName="serverName">
        <DSValue><![CDATA[\\Servername]]></DSValue></DSAttributeMultiString>
    <DSAttributeMultiString bkp:DSAttrName="printAttributes">
        <DSValue><![CDATA[0]]></DSValue>
    </DSAttributeMultiString>
    <DSAttributeMultiString bkp:DSAttrName="printerName">
        <DSValue><![CDATA[PrinterShareName]]></DSValue>
    </DSAttributeMultiString>
</DSObject>

답변

그룹 정책의 파워 쉘 관리는 짜증 내 의견으로는, 타사 (상업) 제품 O / 승.

나는 당신에게있는 거 붙어 생각 은 XML을 짓고을 (또는 당신이 원하는 경우 HTML을 그룹 정책 당신이 찾고있는 무엇을 할 개체에).

다행히도 XML은 끔찍한 것처럼 보이지 않습니다 . 프린터 당 UID 값 (@KatherineVillyard가 자신의 의견에서 언급하는 것으로 생각합니다)은 XML에서 참조되는 각 프린터에 대해 생성 된 임의의 GUID입니다.

다음은 캐서린 코드를 뻔뻔스럽게 모델링 한 샘플 Powershell 코드입니다.

@"
<?xml version="1.0" encoding="utf-8"?>
<Printers clsid="{1F577D12-3D1B-471e-A1B7-060317597B9C}" disabled="0">
"@

$net = New-Object -COMObject WScript.Network
$printserver = 'print-server'

$printerlist = Get-WMIObject -class Win32_Printer -computer $printserver | Where-Object {$_.ShareName -ne $null} | Select-Object ShareName
foreach ($printer in $printerlist)
{
    $date = Get-Date
    echo '  <SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}"'
    '    name="' + $printer.ShareName + '"' | echo
    '    status="' + $printer.ShareName + '"' | echo
    echo '    image="2"'
    '    changed="' + $date + '"' | echo
    $ng = [GUID]::NewGuid().ToString('B')
    '    uid="' + $ng + '">' | echo

    echo '    <Properties'
    echo '      action="R"'
    echo '      comment=""'
    '      path="\\' + $printserver + '\' + $printer.ShareName + '"' | echo
    echo '      location=""'
    echo '      default="1"'
    echo '      skipLocal="1"'
    echo '      deleteAll="0"'
    echo '      persistent="0"'
    echo '      deleteMaps="0"'
    echo '      port=""/>'
    echo '  </SharedPrinter>'
}

@"
</Printers>
"@

(정말 못생긴 Powershell 코드를 작성합니다.)

실제로 GPP CSE가이 XML을 구문 분석하도록 시도하지 않았습니다. XML은 적어도 유효성을 검사합니다.

Get-GPOSYSVOL에서 GPO의 파일 시스템 경로에 도달하기 위해 GUID를 사용 하고 구문 분석하는 몇 가지 괴물에 대해 생각하기 시작 했지만 오늘 저녁에 실제 작업을 수행해야 할 경우 떠날 것이라고 생각합니다. 독자의 연습으로 > smile <그래도 타당해야합니다.


답변

나는 최근 비슷한 프로젝트를 수행했으며 좋은 GPO 푸시 방법 대 새로운 GPP 대 스크립팅을 살펴본 후 모든 것을 스크립팅하기로 결정했습니다. 나는 당신에게 가장 적합한 것이 무엇인지 모르겠지만 여기에 당신을위한 몇 가지 포인터가 있습니다.

  • 새로운 OS (Windows 8 / 2012 +)가있는 클라이언트를 사용하여 인쇄 서버에 연결하고 인쇄 서버에서 프린터 정보를 얻는 것이 이상적입니다.

    Get-Printer-컴퓨터 PrintServerName

  • AD 보안 그룹을 사용하여 인쇄 대기열을 컴퓨터에 매핑합니다. 이름이 \ PrintServer1 \ MyColorPrinter123 인 인쇄 대기열 (위 명령에서 수집 한)이 있고 printer.group.PrintServer1.MyColorPrinter123과 같은 보안 그룹을 생성하고 해당 그룹에 컴퓨터를 추가한다고 가정하겠습니다.

  • 시작 스크립트에서 컴퓨터가 올 때 컴퓨터의 그룹 구성원을 확인하고 프린터 그룹의 일부인지 확인하는 기능이 있습니다. 이 경우 기본 제공 printui.exe (또는 printui.dll) 명령을 사용하여 프린터를 다음과 같이 매핑하십시오.

    Invoke-Expression ‘rundll32 printui.dll, PrintUIEntry / ga / n “\ PrintServer1 \ MyColorPrinter123″/ q’

  • 컴퓨터가 가동되면 해당 인쇄 스풀러 서비스는 GPO가 사용했던 ‘인쇄 연결’을 로그인하려는 모든 사용자에게 푸시합니다.

훨씬 더 자세하게 설명 할 수 있지만 그 수준이 높습니다.

** 사용자 (기술자)가 인쇄 서버를 선택할 수있는 GUI를 만들었으며 해당 서버의 프린터 목록을 제공합니다. 하나를 선택하면 해당 속성을 모두 볼 수 있습니다. 이 정보는 위에서 언급 한 Get-Printer에서 제공됩니다. 해당 데이터를 csv로 내 보내면 해당 정보를 재사용하여 정보를 표시 할 수 있습니다.

** 기술 담당자는 해당 GUI를 사용하여 컴퓨터를 프린터에 연결하라는 요청을 보냅니다. 이것은 ‘요청’입니다. b / c 그들은 AD에 권한이 없습니다.

** 간단한 백엔드 스크립트는 폴더를 감시하고 위에서 언급 한 프린터 그룹에 컴퓨터를 추가합니다. 따라서 누가 어떤 프린터를 받아야하는지 이미 알고 있다면 쉽게 할 수 있습니다. AD Cmdlet을 사용하면 컴퓨터를 그룹에 추가하는 것이 간단합니다.

** 인쇄 서버를 확인하여 새 인쇄 대기열이 있는지 확인하고 AD 그룹과 비교하는 작업을 예약 할 수도 있습니다.

따라서 ‘관리 형’솔루션을 만드는 것은 다소 복잡하지만 기본 사항으로 시작하고 GPO가 포함되지 않은 매우 유연하고 사용하기 쉬운 시스템을 유지하기 위해 계속 추가합니다.


답변